做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
<?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
<?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
<?php

// 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
<?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
 <?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
 <?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表现形式编写
<?php
// 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
<?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
<?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 类的使用方法

自己编写基于MVC的轻量级PHP框架的更多相关文章

  1. 分享自己写的基于Dapper的轻量级ORM框架~

    1.说明 本项目是一个使用.NET Standard 2.0开发的,基于 Dapper 的轻量级 ORM 框架,包含基本的CRUD以及根据表达式进行一些操作的方法,目前只针对单表,不包含多表连接操作. ...

  2. Fastflow——基于golang的轻量级工作流框架

    Fastflow 是什么?用一句话来定义它:一个 基于golang协程.支持水平扩容的分布式高性能工作流框架. 它具有以下特点: 易用性:工作流模型基于 DAG 来定义,同时还提供开箱即用的 API, ...

  3. 基于Spring的轻量级工作流框架

    项目地址 码云:https://git.oschina.net/null_584_3382/business-flow-parent github:https://github.com/Athlizo ...

  4. 基于MVC模式的应用框架之struts

    1.struts开发步骤 引入struts的jar包: 在web.xml中引入struts的核心功能,配置struts核心过滤器:(如果项目中用到了其他过滤器,要放在struts过滤器之前,否则会失效 ...

  5. Spring MVC -- MVC设计模式(演示4个基于MVC框架的案例)

    对于简单的Java Web项目,我们的项目仅仅包含几个jsp页面,由于项目比较小,我们通常可以通过链接方式进行jsp页面间的跳转. 但是如果是一个中型或者大型的项目,上面那种方式就会带来许多维护困难, ...

  6. 微博轻量级RPC框架Motan

    Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...

  7. MVC WebAPI 三层分布式框架开发

    版权声明:本文为博主原创文章,未经博主允许不得转载. 前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理 ...

  8. 转载CSDN (MVC WebAPI 三层分布式框架开发)

    前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理,是本文论述的重点.此外,插件技术的应用,富客户端JQ ...

  9. C# 的轻量级 RPC 框架

    Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Comple ...

随机推荐

  1. 分层服务提供者(LSP)

    分层服务提供者(LSP)(1) 开发过滤数据包的LSP程序可以定义过滤规则,恩,先看看LSP本身是DLL,可以将它安装至Winsock目录,创建套接字的应用程序不必知道此LSP的任何信息就能调用它 1 ...

  2. c++回调

    c++回调包含类函数回调和非类函数回调. 类函数回调,函数指针指向函数名称,需要带类作用域,调用时需要用到类指针. 如qt里面定义一个返回值为qbytearray的函数指针, typedef QByt ...

  3. 获取AX的窗口所有控件的lableID及内容

    思路,穷举Forms\TargetFormName 在AOT上面的路径得到TreeNode, 遍历各控件的属性. a1,先读Label属性,没有就读Caption属性及Text属性. a2,若a1取不 ...

  4. verilog实现奇数倍分频

    在学习FPGA的过程中,最简单最基本的实验应该就是分频器了, 同时分频器也是FPGA设计中使用频率非常高的基本设计之一, 尽管在芯片厂家提供的IDE中集成了锁相环IP, 如altera 的PLL,Xi ...

  5. Oracle 查询字段在什么表

    -- 查询字段在什么表 select * from all_tab_cols t where t.column_name='ABC'; -- 查询字段在什么表并且 判断是否是主键 select * f ...

  6. css3为图片添加鼠标移入放大效果

    只需要为添加效果的图片定义一个伪类 img.zoom-img:hover { -webkit-transform: scale(1.15); -webkit-transition-timing-fun ...

  7. sqlite3里类似top的用法

    sqlite3里类似top的用法 在sqlserver中使用top是很正常的,类似这样的语句: SELECT TOP 10 * FROM [index] ORDER BY id DESC; 但是很不幸 ...

  8. 软件工程 speedsnail 第二次冲刺3

    20150520 完成任务:划线第三天,能画出一条直黄线且与蜗牛共存: 遇到问题: 问题1 碰撞检测有缺陷 解决1 没有解决 明日任务: 实现蜗牛与线的碰撞

  9. 学习实践:使用模式,原则实现一个C++自动化测试程序

    个人编程中比较喜欢重构,重构能够提高自己的代码质量,使代码阅读起来也更清晰.但是重构有一个问题,就是如何保证重构后带代码实现的功能与重构前的一致,如果每次重构完成后,对此不闻不问,则会有极大的风险,如 ...

  10. mysql 5.7压缩包安装笔记

    转载请注明出处http://www.cnblogs.com/havedream/p/5075263.html 重装系统之后准备安装mysql,看到官网上有mysql 5.7.10可以下载就点了,然后就 ...