加入收藏 | 设为首页 | 会员中心 | 我要投稿 草根网 (https://www.0555zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

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

发布时间:2022-12-01 12:41:04 所属栏目:教程 来源:
导读:  做WEB开发已有三年,每次都写重复的东西,因此,想自己写一下框架,以后开发方便.

  本人之前asp.NET一年开发,jsp半年,可是后来因为工作的原故换成PHP.其实很不喜欢PHP的语法.还有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
 
  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
 
  /*
 
  */
 
  //nodirectaccess
 
  defined('EXEC')ordie('Restrictedaccess');//如果单独执行这个文件,将不能执行
 
  //站点路径
 
  define('PATH_SITE',PATH_ROOT);
 
  //包含文件路径
 
  define('PATH_INCLUDE'php轻框架,PATH_ROOT.DS.'includes');
 
  //类文件路径
 
  define('PATH_CLASS',PATH_ROOT.DS.'class');
 
  //配置文件路径
 
  define('PATH_CONFIG',PATH_ROOT);
 
  五.框架文件路径frameword.inc.php
 
  f
 
  //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
 
  //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
 
  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
 
  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表现形式编写
 
  //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:(注:这里的URL格式可以在router.inc.php里面修改.同时为了让不同目录的地址格式不一样,比如前台和后台,因些,把router.inc.php规则放在了入口文件的includes目录下面)则会调用/admin/control/文件夹下面的test.php文件test类的getUser函数,如果task参数为空,则调用index函数.
 
  文件:/admin/control/test.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
 
  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类的使用方法
 

(编辑:草根网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!