轻量级mvc php,自己编写基于MVC的轻量级PHP框架

http://www.cnblogs.com/Peacha/p/3415898.html

做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 模型类

├ template smartTemplate 类存放文件夹

├ db adodb 类存放文件夹

├ includes 包含文件类

├ defines.inc.php 定义各路径文件

├ frameword.inc.php 框架处理文件

├ router.inc.php 路由文件,跟据参数,跳转不同路径

├ models 模式存放路径

├ views 模版文件保存路径

├ controls 存放控制类的文件夹

├ config.php 配置文件

├ admin 后台

二.简单类图

三. 入口文件,index.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');

echo request->Get('a');//参数的获取GET方法

request->Post(‘a’);//获取POST参数

?>

四. 路径定义文件 defines.inc.php

/*

*/

// no direct access

defined( 'EXEC' ) or die( 'Restricted access' ); //如果单独执行这个文件,将不能执行

//站点路径

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

// no direct access

defined( 'EXEC' ) or die( 'Restricted access' );

//load error class

require_once( PATH_CLASS.DS.'error.class.php'); //包含错误处理文件

//load base class

require_once( PATH_CLASS.DS.'base.class.php' ); //包含基类文件

//实例化基类

load=new Base();

//实列化请求类 用于获取GET或POST

//加截一个自己写的类的方法

//把自己写的类放在class 文件夹下面,文件名的格式为demo.class.php

//那么类名就为 class demo{}

//实便化的方式为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

// no direct access

defined( 'EXEC' ) or die( 'Restricted access' );

class Base extends Error

{

var path_root ='';

var path_class ='';

var path_control ='';

/*/构造函数

*@parame path 应用路径

*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()

{

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("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

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

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

跟据URL,指定到相应的控制器,跟据网站的URL表现形式编写

// no direct access

defined( 'EXEC' ) or die( 'Restricted access' );

//实例化类

load=new Base();

//实列化请求类 用于获取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=new option();

if(empty(task))

{

Control->index();

}

else

{

Control->task();

}

?>

十,使用方法

使用方法.

视图V:在把模板文件放在VIEW文件夹里面.命名方式为,login.html

控制C:把要怎么处理的文件放在control文件夹里面,

格式为.demo.php

class demo extends Control

{

function edit()

{

data=this->user->issuer();//调用模型

this->view(‘login’,data);//这个LOGIN为视图中的login.html文件

}

}

模型 M:把文件放在 model文件夹里面.格式为.user.php

class user extends Model

{

function issuer()

{

数据库或底层的操作,返回结果

}

}

自定义类的调用,把类放在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

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')这个模型经常用到,可以在引用类的构造函数中初始化,不要每次都实例化.如:

Var member;

function test()

{

this->member=this->model('member');

}

这样,应用的时候只要. this->member ->addUser();

this->model(‘member’)->getUser();

为调用入口文件相应目录下的Models 文件夹下面的member.php文件里面的getUser();函数

文件:/admin/models/member.php

class member extends Model

{

function getUser()

{

//return this->db->GetOne("select username from user where userId=1");//这种方式处理数据库

//this->request->Get(‘test’)

//this->request->Post(‘test’) 这种方式获取参数,在父类中已定义

return 'admin';

}

//验证用户名是否已经存在

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);

显示视图,调用/admin/views/test.html文件,用SmartTemplate 类的方式生成 data 为数组

这部份请查看smartTemplate 类的使用方法

转载于:https://www.cnblogs.com/Peacha/p/3415898.html

标签:PHP,db,class,MVC,PATH,model,php,DS,轻量级

来源: https://blog.csdn.net/weixin_30263277/article/details/95000365

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值