自己编写基于MVC的轻量级PHP框架.docx
《自己编写基于MVC的轻量级PHP框架.docx》由会员分享,可在线阅读,更多相关《自己编写基于MVC的轻量级PHP框架.docx(11页珍藏版)》请在冰豆网上搜索。
自己编写基于MVC的轻量级PHP框架
做WEB开发已有一年,每次都写重复的东西,因此,想自己写一下框架,以后开发方便.
本人之前学习asp.NET两年,JSP半年,可是后来因为工作的原故换成PHP.其实很不喜欢PHP的语法.还有PHP的函数名,每回都忘记..还是喜欢C#和JAVA的语法,哈...不过PHP有PHP的优点,不像ASP.NET那样封装了大量的东西,PHP更简单,更自由吧.还有应该就是PHP的开源组合.
写这编文章主要是因为那些东西要写给别人看,顺便发表了.高手看了别笑,菜鸟自己注意辨别,别被我的错误观点误导.
文章中的代码下载
一.文件结构
├ index.php入口文件
├class类存放的文件夹
├base.class.php基类
├error.class.php错误处理类
├parms.class.php获取参数类
├control.class.php控制类
├model.class.php模型类
├templatesmartTemplate类存放文件夹
├dbadodb类存放文件夹
├includes包含文件类
├ defines.inc.php定义各路径文件
├frameword.inc.php框架处理文件
├router.inc.php路由文件,跟据参数,跳转不同路径
├models模式存放路径
├views模版文件保存路径
├controls存放控制类的文件夹
├config.php配置文件
├admin后台
├
├
二.简单类图
三.入口文件,index.php
php
define("EXEC",1);//初始化一个常量,保存别的文件必须先有这个入口文件的引用.
define('PATH_BASE',dirname(__FILE__));//获取入口文件的路径
define('DS',DIRECTORY_SEPARATOR);//目录的分隔,’/’或’’
define('PATH_ROOT',PATH_BASE);//站点的跟目录,跟据你的入品文件存放来定义,如果放在子目录下,则要做相应修改.如下,
//把路径分组
{parts=explode(DS,PATH_BASE);
//去除最后一个路径名
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');
echorequest->Get('a');//参数的获取GET方法
request->Post(‘a’);//获取POST参数
?
>
四.路径定义文件defines.inc.php
php
/*
*/
//nodirectaccess
defined('EXEC')ordie('Restrictedaccess');//如果单独执行这个文件,将不能执行
//站点路径
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
//nodirectaccess
defined('EXEC')ordie('Restrictedaccess');
//loaderrorclass
require_once(PATH_CLASS.DS.'error.class.php');//包含错误处理文件
//loadbaseclass
require_once(PATH_CLASS.DS.'base.class.php');//包含基类文件
//实例化基类
load=newBase();
//实列化请求类用于获取GET或POST
//加截一个自己写的类的方法
//把自己写的类放在class文件夹下面,文件名的格式为demo.class.php
//那么类名就为classdemo{}
//实便化的方式为demo=load->library(‘demo’);
//调用demo类的Get函数则为demo->Get(‘参数’);
request=load->library('params');
//不同的目录用不同的URL方式
require_once(PATH_BASE.DS.'includes'.DS.'router.inc.php');
?
>
六.基类函数包含了常用的功能base.class.php
php
//nodirectaccess
defined('EXEC')ordie('Restrictedaccess');
classBaseextendsError
{
varpath_root='';
varpath_class='';
varpath_control='';
/*/构造函数
*@paramepath应用路径
*returnnull
*/
publicfunctionBase()
{
this->path_root=PATH_ROOT;
this->path_class=PATH_CLASS;
this->path_control=PATH_BASE.DS.'controls';
}
//加载模型
//loadmodel
functionmodel(name)
{
include_once(this->path_model.DS.name.'.php');
model=null;
if(model==null)
{
model=newname();
}
returnmodel;
}
//outputpage
/*
*@paramaternamefilename
*@paramaterdatareplace
*
*/
functionview(name,data)
{
Template=self:
:
template(file);
Template->output(data);
unset(Template);
}
//createdatabaseconnection
functiondatabase()
{
include_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("Couldnotconnecttothedatabase.");
}else{
this->db->Execute("setnames'utf8'");
returnthis->db;
}
}
//createtemplate
functiontemplate(file)
{
include_once(PATH_CLASS.DS.'template'.DS.'class.smarttemplate.php');
Template=newSmarttemplate(file);
Template->template_dir=PATH_BASE.self:
:
config('template_dir');
Template->cache_dir=PATH_BASE.self:
:
config('cache_dir');
returnTemplate;
}
//importclass
functionlibrary(className)
{
if(empty(className))
{
returnnull;
exit();
}
else
{
require_once(PATH_CLASS.DS.className.'.class.php');
returnnewclassName();
}
}
//returnconfigvalue
functionconfig(parameter)
{
require_once(PATH_CONFIG.DS.'config.php');
returnCONFIG:
:
Ini()->parameter;
}
}
?
>
七.控制器父类control.class.php
php
classControlextendsBase
{
varrequest;
functionControl()
{
this->request=this->library('params');
}
//outputpage
/*
*@paramaternamefilename
*@paramaterdatareplace
*
*/
functionview(name,data='')
{
Template=this->template(name.'.html');
Template->assign('site_root',this->config('site_root'));
Template->assign(data);
Template->output();
unset(Template);
}
//loadmodel
functionmodel(name)
{
include_once(PATH_BASE.DS.'models'.DS.name.'.php');
if(this->model==null)
{
this->model=newname();
}
returnthis->model;
}
}
?
>
八.模型父类model.class.php
php
classModelextendsBase
{
varrequest;
vardb;
functionModel()
{
this->request=this->library('params');
}
//createdatabaseconnection
functiondatabase()
{
if(this->db!
=null)
{
returnthis->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("Couldnotconnecttothedatabase.");
}else{
this->db->Execute("setnames'utf8'");
returnthis->db;
}
}
}
?
>
九.路由文件,router.inc.php
跟据URL,指定到相应的控制器,跟据网站的URL表现形式编写
php
//nodirectaccess
defined('EXEC')ordie('Restrictedaccess');
//实例化类
load=newBase();
//实列化请求类用于获取GET或POST
request=load->library('params');
//获取参数
option=@request->get('option');
task=@request->get('task');
//如果未设置文件
if(empty(option))
{
option=load->config('index_router');
}
include_once(PATH_BASE.DS.'controls'.DS.option.'.php');
Control=newoption();
if(empty(task))
{
Control->index();
}
else
{
Control->task();
}
?
>
十,使用方法
使用方法.
视图V:
在把模板文件放在VIEW文件夹里面.命名方式为,login.html
控制C:
把要怎么处理的文件放在control文件夹里面,
格式为.demo.php
classdemoextendsControl
{
functionedit()
{
data=this->user->issuer();//调用模型
this->view(‘login’,data);//这个LOGIN为视图中的login.html文件
}
}
模型M:
把文件放在model文件夹里面.格式为.user.php
classuserextendsModel
{
functionissuer()
{
数据库或底层的操作,返回结果
}
}
自定义类的调用,把类放在Class文件夹下面.格式为session.class.php
先实例化.
session=load->library(‘session’);
然后再调用类中的函数
session->sessionId();
例子:
如下URL:
http:
//127.0.0.1/com/admin/?
option=test&task=getUser(注:
这里的URL格式可以在router.inc.php里面修改.同时为了让不同目录的地址格式不一样,比如前台和后台,因些,把router.inc.php规则放在了入口文件的includes目录下面)则会调用/admin/control/文件夹下面的test.php文件test类的getUser函数,如果task参数为空,则调用index函数.
文件:
/admin/control/test.php
php
classtestextendsControl
{
functionindex()
{
}
functiongetUser()
{
data['user']=this->model('member')->getUser();
this->view('test',data);
}
functionreg()
{
if(this->model('member')->isUser())
{
this->Alert(‘用户名已存在’);//error类中定义了
}
else
{
this->model('member')->addUser();
}
}
}
?
>
如果this->model('member')这个模型经常用到,可以在引用类的构造函数中初始化,不要每次都实例化.如:
Varmember;
functiontest()
{
this->member=this->model('member');
}
这样,应用的时候只要.this->member->addUser();
this->model(‘member’)->getUser();
为调用入口文件相应目录下的Models文件夹下面的member.php文件里面的getUser();函数
文件:
/admin/models/member.php
php
classmemberextendsModel
{
functiongetUser()
{
//returnthis->db->GetOne("selectusernamefromuserwhereuserId=1");//这种方式处理数据库
//this->request->Get(‘test’)
//this->request->Post(‘test’)这种方式获取参数,在父类中已定义
return'admin';
}
//验证用户名是否已经存在
functionisUser()
{
userName=this->request->Post(‘username’);
passWord=this->request->Post(‘password’);
returnthis->db->GetOne(“selectcount(*)fromuserwhereusername=’userName’andpassword=’passWord’”);
}
}
?
>
this->view(‘test’,data);
显示视图,调用/admin/views/test.html文件,用SmartTemplate类的方式生成data为数组
这部份请查看smartTemplate类的使用方法