解析基于MVC的輕量級(jí)PHP框架_PHP教程
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!
推薦:php如何實(shí)現(xiàn)報(bào)表類原創(chuàng)內(nèi)容....實(shí)現(xiàn)曲線圖,餅圖,柱形圖. 轉(zhuǎn)貼請(qǐng)注明出處, http://blog.csdn.net/liq330 效果圖: 原代碼如下: ?php class ImageReport { var Image;//圖片對(duì)像 var ImageName;//報(bào)表名稱 var ImageType;//報(bào)表類型 var ImageWidth;//圖片寬 var ImageHeight;//
做WEB開(kāi)發(fā)已有一年,每次都寫(xiě)重復(fù)的東西, 因此,想自己寫(xiě)一下框架,以后開(kāi)發(fā)方便.
本人之前學(xué)習(xí)asp.NET兩年,JSP半年,可是后來(lái)因?yàn)楣ぷ鞯脑蕮Q成PHP.其實(shí)很不喜歡PHP的語(yǔ)法.還有PHP的函數(shù)名,每回都忘記..還是喜歡C#和JAVA的語(yǔ)法,哈...不過(guò)PHP有PHP的優(yōu)點(diǎn),不像ASP.NET那樣封裝了大量的東西,PHP更簡(jiǎn)單,更自由吧.還有應(yīng)該就是PHP的開(kāi)源組合.
寫(xiě)這編文章主要是因?yàn)槟切〇|西要寫(xiě)給別人看,順便發(fā)表了.高手看了別笑,菜鳥(niǎo)自己注意辨別,別被我的錯(cuò)誤觀點(diǎn)誤導(dǎo).
文章中的代碼下載
一.文件結(jié)構(gòu)
├ index.php 入口文件
├ class 類存放的文件夾
├ base.class.php 基類
├ error.class.php 錯(cuò)誤處理類
├ parms.class.php 獲取參數(shù)類
├ control.class.php 控制類
├ model.class.php 模型類
├ template smartTemplate 類存放文件夾
├ db adodb 類存放文件夾
├ includes 包含文件類
├ defines.inc.php 定義各路徑文件
├ frameword.inc.php 框架處理文件
├ router.inc.php 路由文件,跟據(jù)參數(shù),跳轉(zhuǎn)不同路徑
├ models 模式存放路徑
├ views 模版文件保存路徑
├ controls 存放控制類的文件夾
├ config.php 配置文件
├ admin 后臺(tái)
├
├
二.簡(jiǎn)單類圖
三. 入口文件,index.php
<?php
define("EXEC",1); //初始化一個(gè)常量,保存別的文件必須先有這個(gè)入口文件的引用.
define('PATH_BASE',dirname(__FILE__)); //獲取入口文件的路徑
define('DS', DIRECTORY_SEPARATOR); //目錄的分隔,’/’ 或’’
define( 'PATH_ROOT', PATH_BASE ); //站點(diǎn)的跟目錄,跟據(jù)你的入品文件存放來(lái)定義,如果放在子目錄下,則要做相應(yīng)修改.如下,
//把路徑分組
{parts = explode( DS, PATH_BASE );
//去除最后一個(gè)路徑名
array_pop( parts );
define( 'PATH_ROOT', implode( DS, parts ) );}
require_once(PATH_ROOT.DS.'includes'.DS.'defines.inc.php'); //各文件夾的路徑
require_once(PATH_ROOT.DS.'includes'.DS.'framework.inc.php');
echo request->Get('a');//參數(shù)的獲取GET方法
request->Post(‘a’);//獲取POST參數(shù)
?>
define("EXEC",1); //初始化一個(gè)常量,保存別的文件必須先有這個(gè)入口文件的引用.
define('PATH_BASE',dirname(__FILE__)); //獲取入口文件的路徑
define('DS', DIRECTORY_SEPARATOR); //目錄的分隔,’/’ 或’’
define( 'PATH_ROOT', PATH_BASE ); //站點(diǎn)的跟目錄,跟據(jù)你的入品文件存放來(lái)定義,如果放在子目錄下,則要做相應(yīng)修改.如下,
//把路徑分組
{parts = explode( DS, PATH_BASE );
//去除最后一個(gè)路徑名
array_pop( parts );
define( 'PATH_ROOT', implode( DS, parts ) );}
require_once(PATH_ROOT.DS.'includes'.DS.'defines.inc.php'); //各文件夾的路徑
require_once(PATH_ROOT.DS.'includes'.DS.'framework.inc.php');
echo request->Get('a');//參數(shù)的獲取GET方法
request->Post(‘a’);//獲取POST參數(shù)
?>
四. 路徑定義文件 defines.inc.php
<?php
/*
*/
// no direct access
defined( 'EXEC' ) or die( 'Restricted access' ); //如果單獨(dú)執(zhí)行這個(gè)文件,將不能執(zhí)行
//站點(diǎn)路徑
define( 'PATH_SITE', PATH_ROOT );
//包含文件路徑
define( 'PATH_INCLUDE', PATH_ROOT.DS.'includes');
//類文件路徑
define( 'PATH_CLASS', PATH_ROOT.DS.'class' );
//配置文件路徑
define( 'PATH_CONFIG', PATH_ROOT );
?>
/*
*/
// no direct access
defined( 'EXEC' ) or die( 'Restricted access' ); //如果單獨(dú)執(zhí)行這個(gè)文件,將不能執(zhí)行
//站點(diǎn)路徑
define( 'PATH_SITE', PATH_ROOT );
//包含文件路徑
define( 'PATH_INCLUDE', PATH_ROOT.DS.'includes');
//類文件路徑
define( 'PATH_CLASS', PATH_ROOT.DS.'class' );
//配置文件路徑
define( 'PATH_CONFIG', PATH_ROOT );
?>
五. 框架文件路徑 frameword.inc.php
f
<?php
// no direct access
defined( 'EXEC' ) or die( 'Restricted access' );
//load error class
require_once( PATH_CLASS.DS.'error.class.php'); //包含錯(cuò)誤處理文件
//load base class
require_once( PATH_CLASS.DS.'base.class.php' ); //包含基類文件
//實(shí)例化基類
load=new Base();
//實(shí)列化請(qǐng)求類 用于獲取GET或POST
//加截一個(gè)自己寫(xiě)的類的方法
//把自己寫(xiě)的類放在class 文件夾下面,文件名的格式為demo.class.php
//那么類名就為 class demo{}
//實(shí)便化的方式為demo=load->library(‘demo’);
//調(diào)用demo類的Get函數(shù)則為 demo->Get(‘參數(shù)’);
request=load->library('params');
//不同的目錄用不同的URL方式
require_once( PATH_BASE.DS.'includes'.DS.'router.inc.php' );
?>
// no direct access
defined( 'EXEC' ) or die( 'Restricted access' );
//load error class
require_once( PATH_CLASS.DS.'error.class.php'); //包含錯(cuò)誤處理文件
//load base class
require_once( PATH_CLASS.DS.'base.class.php' ); //包含基類文件
//實(shí)例化基類
load=new Base();
//實(shí)列化請(qǐng)求類 用于獲取GET或POST
//加截一個(gè)自己寫(xiě)的類的方法
//把自己寫(xiě)的類放在class 文件夾下面,文件名的格式為demo.class.php
//那么類名就為 class demo{}
//實(shí)便化的方式為demo=load->library(‘demo’);
//調(diào)用demo類的Get函數(shù)則為 demo->Get(‘參數(shù)’);
request=load->library('params');
//不同的目錄用不同的URL方式
require_once( PATH_BASE.DS.'includes'.DS.'router.inc.php' );
?>
六. 基類函數(shù)包含了常用的功能 base.class.php
<?php
// no direct access
defined( 'EXEC' ) or die( 'Restricted access' );
class Base extends Error
{
var path_root ='';
var path_class ='';
var path_control ='';
/*/構(gòu)造函數(shù)
*@parame path 應(yīng)用路徑
*return null
*/
public function Base()
{
this->path_root =PATH_ROOT;
this->path_class =PATH_CLASS;
this->path_control=PATH_BASE.DS.'controls';
}
//加載模型
//load model
function model(name)
{
include_once (this->path_model.DS.name.'.php');
model=null;
if(model==null)
{
model=new name();
}
return model;
}
//output page
/*
*@paramater name file name
*@paramater data replace
*
*/
function view(name,data)
{
Template=self::template(file);
Template->output(data);
unset(Template);
}
//create database connection
function database()
{
iclude_once (PATH_CLASS.DS.'db'.DS.'adodb.inc.php');
this->db = ADONewConnection();
this->db->createdatabase = true;
result = this->db->Connect(self::config('db_host') , self::config('db_user'), self::config('db_password'), self::config('db_database') );
if(!result)
{
die("Could not connect to the database.");
}else{
this->db->Execute("set names 'utf8'");
return this->db;
}
}
//create template
function template(file)
{
include_once (PATH_CLASS.DS.'template'.DS.'class.smarttemplate.php');
Template = new Smarttemplate(file)
Template->template_dir=PATH_BASE.self::config('template_dir');
Template->cache_dir =PATH_BASE.self::config('cache_dir');
return Template;
}
//import class
function library(className)
{
if(empty(className))
{
return null;
exit();
}
else
{
require_once(PATH_CLASS.DS.className.'.class.php');
return new className();
}
}
//return config value
function config(parameter)
{
require_once(PATH_CONFIG.DS.'config.php');
return CONFIG::Ini()->parameter;
}
}
?>
// no direct access
defined( 'EXEC' ) or die( 'Restricted access' );
class Base extends Error
{
var path_root ='';
var path_class ='';
var path_control ='';
/*/構(gòu)造函數(shù)
*@parame path 應(yīng)用路徑
*return null
*/
public function Base()
{
this->path_root =PATH_ROOT;
this->path_class =PATH_CLASS;
this->path_control=PATH_BASE.DS.'controls';
}
//加載模型
//load model
function model(name)
{
include_once (this->path_model.DS.name.'.php');
model=null;
if(model==null)
{
model=new name();
}
return model;
}
//output page
/*
*@paramater name file name
*@paramater data replace
*
*/
function view(name,data)
{
Template=self::template(file);
Template->output(data);
unset(Template);
}
//create database connection
function database()
{
iclude_once (PATH_CLASS.DS.'db'.DS.'adodb.inc.php');
this->db = ADONewConnection();
this->db->createdatabase = true;
result = this->db->Connect(self::config('db_host') , self::config('db_user'), self::config('db_password'), self::config('db_database') );
if(!result)
{
die("Could not connect to the database.");
}else{
this->db->Execute("set names 'utf8'");
return this->db;
}
}
//create template
function template(file)
{
include_once (PATH_CLASS.DS.'template'.DS.'class.smarttemplate.php');
Template = new Smarttemplate(file)
Template->template_dir=PATH_BASE.self::config('template_dir');
Template->cache_dir =PATH_BASE.self::config('cache_dir');
return Template;
}
//import class
function library(className)
{
if(empty(className))
{
return null;
exit();
}
else
{
require_once(PATH_CLASS.DS.className.'.class.php');
return new className();
}
}
//return config value
function config(parameter)
{
require_once(PATH_CONFIG.DS.'config.php');
return CONFIG::Ini()->parameter;
}
}
?>
七. 控制器父類control.class.php
<?php
class Control extends Base
{
var request;
function Control()
{
this->request=this->library('params');
}
//output page
/*
*@paramater name file name
*@paramater data replace
*
*/
function view(name,data='')
{
Template=this->template(name.'.html');
Template->assign('site_root',this->config('site_root'));
Template->assign(data);
Template->output();
unset(Template);
}
//load model
function model(name)
{
include_once (PATH_BASE.DS.'models'.DS.name.'.php');
if(this->model==null)
{
this->model=new name();
}
return this->model;
}
}
?>
class Control extends Base
{
var request;
function Control()
{
this->request=this->library('params');
}
//output page
/*
*@paramater name file name
*@paramater data replace
*
*/
function view(name,data='')
{
Template=this->template(name.'.html');
Template->assign('site_root',this->config('site_root'));
Template->assign(data);
Template->output();
unset(Template);
}
//load model
function model(name)
{
include_once (PATH_BASE.DS.'models'.DS.name.'.php');
if(this->model==null)
{
this->model=new name();
}
return this->model;
}
}
?>
八. 模型父類 model.class.php
<?php
class Model extends Base
{
var request;
var db;
function Model()
{
this->request=this->library('params');
}
//create database connection
function database()
{
if(this->db!=null)
{
return this->db;
exit;
}
include_once (PATH_CLASS.DS.'db'.DS.'adodb.inc.php');
this->db = ADONewConnection();
this->db->createdatabase = true;
result = this->db->Connect(this->config('db_host') , this->config('db_user'), this->config('db_password'), this->config('db_database') );
if(!result)
{
die("Could not connect to the database.");
}else{
this->db->Execute("set names 'utf8'");
return this->db;
}
}
}
?>
class Model extends Base
{
var request;
var db;
function Model()
{
this->request=this->library('params');
}
//create database connection
function database()
{
if(this->db!=null)
{
return this->db;
exit;
}
include_once (PATH_CLASS.DS.'db'.DS.'adodb.inc.php');
this->db = ADONewConnection();
this->db->createdatabase = true;
result = this->db->Connect(this->config('db_host') , this->config('db_user'), this->config('db_password'), this->config('db_database') );
if(!result)
{
die("Could not connect to the database.");
}else{
this->db->Execute("set names 'utf8'");
return this->db;
}
}
}
?>
九. 路由文件, router.inc.php
跟據(jù)URL,指定到相應(yīng)的控制器,跟據(jù)網(wǎng)站的URL表現(xiàn)形式編寫(xiě)
<?php
// no direct access
defined( 'EXEC' ) or die( 'Restricted access' );
//實(shí)例化類
load=new Base();
//實(shí)列化請(qǐng)求類 用于獲取GET或POST
request=load->library('params');
//獲取參數(shù)
option=@request->get('option');
task =@request->get('task');
//如果未設(shè)置文件
if(empty(option))
{
option=load->config('index_router');
}
include_once (PATH_BASE.DS.'controls'.DS.option.'.php');
Control=new option();
if(empty(task))
{
Control->index();
}
else
{
Control->task();
}
?>
<?php
// no direct access
defined( 'EXEC' ) or die( 'Restricted access' );
//實(shí)例化類
load=new Base();
//實(shí)列化請(qǐng)求類 用于獲取GET或POST
request=load->library('params');
//獲取參數(shù)
option=@request->get('option');
task =@request->get('task');
//如果未設(shè)置文件
if(empty(option))
{
option=load->config('index_router');
}
include_once (PATH_BASE.DS.'controls'.DS.option.'.php');
Control=new option();
if(empty(task))
{
Control->index();
}
else
{
Control->task();
}
?>
十,使用方法
使用方法.
視圖V:在把模板文件放在VIEW文件夾里面.命名方式為,login.html
控制C:把要怎么處理的文件放在control文件夾里面,
格式為.demo.php
class demo extends Control
格式為.demo.php
class demo extends Control
{
function edit()
{
data=this->user->issuer();//調(diào)用模型
this->view(‘login’,data);//這個(gè)LOGIN為視圖中的login.html文件
}
}
模型 M:把文件放在 model文件夾里面.格式為.user.php
class user extends Model
{
function issuer()
{
數(shù)據(jù)庫(kù)或底層的操作,返回結(jié)果
}
}
自定義類的調(diào)用,把類放在Class文件夾下面.格式為session.class.php
先實(shí)例化.
session=load->library(‘session’);
然后再調(diào)用類中的函數(shù)
session->sessionId();
session->sessionId();
例子:
如下URL: http://127.0.0.1/com/admin/?option=test&task=getUser (注:這里的URL格式可以在router.inc.php里面修改.同時(shí)為了讓不同目錄的地址格式不一樣,比如前臺(tái)和后臺(tái),因些,把router.inc.php規(guī)則放在了入口文件的includes目錄下面) 則會(huì)調(diào)用/admin/control/文件夾下面的test.php文件test類的getUser 函數(shù),如果task參數(shù)為空,則調(diào)用index函數(shù).
文件:/admin/control/test.php
<?php
class test extends Control
{
function index()
{
}
function getUser()
{
data['user']=this->model('member')->getUser();
this->view('test',data);
}
function reg()
{
if(this->model('member')->isUser())
{
this->Alert(‘用戶名已存在’); //error類中定義了
}
else
{
this->model('member')->addUser();
}
}
}
?>
如果this->model('member')這個(gè)模型經(jīng)常用到,可以在引用類的構(gòu)造函數(shù)中初始化,不要每次都實(shí)例化.如:
Var member;
function test()
{
this->member=this->model('member');
}
這樣,應(yīng)用的時(shí)候只要. this->member ->addUser();
this->model(‘member’)->getUser();
為調(diào)用入口文件相應(yīng)目錄下的Models 文件夾下面的member.php文件里面的getUser();函數(shù)
文件:/admin/models/member.php
<?php
class member extends Model
{
function getUser()
{
//return this->db->GetOne("select username from user where userId=1");//這種方式處理數(shù)據(jù)庫(kù)
//this->request->Get(‘test’)
//this->request->Post(‘test’) 這種方式獲取參數(shù),在父類中已定義
return 'admin';
}
//驗(yàn)證用戶名是否已經(jīng)存在
function isUser()
{
userName=this->request->Post(‘username’);
passWord=this->request->Post(‘password’);
return this->db->GetOne(“select count(*) from user where username=’userName’ and password=’passWord’”);
}
}
?>
this->view(‘test’,data);
顯示視圖,調(diào)用/admin/views/test.html文件,用SmartTemplate 類的方式生成 data 為數(shù)組
這部份請(qǐng)查看smartTemplate 類的使用方法
分享:PHP購(gòu)物車類因?yàn)樾枨笾兄挥涗洰a(chǎn)品的類型,還有編號(hào)..比如食物,,然后什么編號(hào),,這樣子.所以沒(méi)有記錄產(chǎn)品的數(shù)量..要用的自己改進(jìn)一下就行了. ?php //setcookie(cart,s:26,45,4,4523423|d:17,7,27,26|e:12,13,123,43|f:34); //cartAdd('e','167'); //getProInfo('z'); /
相關(guān)PHP教程:
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁(yè)面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問(wèn)控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語(yǔ)言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國(guó)語(yǔ)言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說(shuō)明:
PHP教程-解析基于MVC的輕量級(jí)PHP框架。