设为首页 收藏本站
查看: 735|回复: 0

[经验分享] 自己编写基于MVC的轻量级PHP框架

[复制链接]

尚未签到

发表于 2017-4-4 08:55:13 | 显示全部楼层 |阅读模式
  自己编写基于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 模型类
  ├ template smartTemplate 类存放文件夹
  ├ db    adodb 类存放文件夹
  ├ includes 包含文件类
  ├ defines.inc.php 定义各路径文件
  ├ frameword.inc.php 框架处理文件
  ├ router.inc.php 路由文件,跟据参数,跳转不同路径
  ├ models 模式存放路径
  ├ views 模版文件保存路径
  ├ controls 存放控制类的文件夹
  ├ config.php 配置文件
  ├ admin 后台
  ├
  ├
  二.简单类图
DSC0000.jpg

  三.   入口文件,index.php
  <?phpdefine("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 accessdefined( '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<?php// no direct accessdefined( 'EXEC' ) or die( 'Restricted access' );//load error classrequire_once( PATH_CLASS.DS.'error.class.php');  //包含错误处理文件//load base classrequire_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.phpa<?php// no direct accessdefined( '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 modelfunction 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 connectionfunction 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 valuefunction  config($parameter){require_once(PATH_CONFIG.DS.'config.php');return CONFIG::Ini()->$parameter;}}?>七. 控制器父类control.class.php<?phpclass 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 modelfunction 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<?phpclass Model extends Base{var $request;var $db;function Model() {$this->request=$this->library('params');}//create database connectionfunction 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.phpa跟据URL,指定到相应的控制器,跟据网站的URL表现形式编写<?php// no direct accessdefined( '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();}?>f十,使用方法使用方法.视图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<?phpclass 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<?phpclass 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 类的使用方法

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-359868-1-1.html 上篇帖子: PHP实现图片批量上代码 下篇帖子: php取得文件后缀名的两个函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表