PHP仿tp实现mvc框架基本设计思路与实现方法分析
本文实例讲述了PHP仿tp实现mvc框架基本设计思路与实现方法。分享给大家供大家参考,具体如下:
仿tpmvc基本设计与简单实现
一:文件加载常识
变量常量函数类
文件加载的函数或者使用命名空间:require(); require_once(); include(); include_once();
常量:define("DEFINE",""); constconstant="value";
函数:functionfun(){} //global使用全局变量 局部变量不被外部调用。
类:
a;//输出属性. } publicfunction__construct(){//构造方法,实例化后自动执行, echo$this->bb();//调用方法。 } publicfunctionbb(){ echo"我是bb"; } } $a=newA; $a->aa(); classBextendsA{//继承A,类A是类B的父级。继承public的, } $b=newB; $b->aa();//可以输出类A里面的属性。
工厂模式参阅:https://www.nhooo.com/article/140658.htm
//-----------------------------工厂模式-------------------------// classA{ public$class;//public$class=$_GET['c'];//类名 public$method;//public$method=$_GET['m'];//方法 publicfunction__construct($class,$method){ //或者通过$_SERVER['PATH_INFO'];转换得到类名或者方法名(下面讲解)。 $this->class=ucfirst(strtolower($class)).'Controller';//对类名进行安全处理,并加上控制器后缀 $this->method=strtolower($method);//对方法名进行安全处理 $this->work($this->class,$this->method); } publicfunctionwork($class,$method){ //把文件命名成(类名.class.php的形式),就可以通过类名找到文件。 //include'文件名(文件在别的地方)';#例如include'./index.php';引入文件然后实例化类。 $c=new$class;//实例化类 $c->$method();//访问类的方法 } }
至此我们可以通过url的$_GET参数来解决
例如:http://mvc.com/index.php?h=home&v=Index&c=index.html
h为前后台,v为控制器,c为模板。
$v=$_GET['v']; $c=rtrim($_GET['c'],".html"); newA($v,$c);//根据继承关系再次加载文件。 //extract($arr);//extract的作用:从数组中将变量导入到当前的符号表,键做变量,值做值! //compact();//—建立一个数组,包括变量名和它们的值 //assigndisplay实现参阅:https://www.nhooo.com/article/140661.htm
classController{ public$array; public$key; public$val; publicfunctionassign($key,$val){ if(array($val)){ $this->array["$key"]=$val; }else{ $this->array["$key"]=compact($val); } } publicfunctiondisplay($tpl=''){//模板为空自动加载。 $this->assign($this->key,$this->val); extract($this->array); //如果模板为空就在这里根据get参数添加或者通过$_SERVER['PATH_INFO'];转换得到。(下面讲解) if(file_exists($tpl)){//模板存在就加载文件。 include$tpl; } } } //继承总model。这个model名字和控制器model的名字是一样的。继承方法同Controller,总model必须需要加上一个return。数据处理的indexmodel可以加return,也可以不加。 classIndexModelextendsModel{ publicfunctionindex(){ //数据处理。 //需要返回数据就加上return。 } } classIndexControllerextendsController{//继承 publicfunctionindex(){ $m=Model("index"); echo'实例化后的index方法
'; $this->assign('m',$m);//分配数据。 $this->display('index.html');//模板 } }
mvc虽然实现但是不够人性化,因为每次都要加上get参数,变得很冗长,解决的关键在于$_SERVER['PATH_INFO'];
用这个替换掉hmv三个参数。
1.当输入url为:http://mvc.com/index.php/home/index/index.html
这种情况下 index.php斜线后面的apache会自动认为是一个路径。
$_SERVER['PATH_INFO']= /home/index/index.html
第1个斜线/home 前后台
第2个斜线/index 控制器
第3个斜线/index.html 模板文件
如果后面加有参数例如:?a=18&b=38 他不会被加到$_SERVER['PATH_INFO']里面。$_POST或者$_GET也不会加入$_SERVER['PATH_INFO']里面的内容,这样就可以让控制参数和数据的参数互不冲突。
2.U方法的实现。重新改写$_SERVER['PATH_INFO']参数,改变为一个数据。array('home','Index','index');
每次进入入口文件index.php都把他的PHP_INFO参数转换为数组,在控制器或者其他的地方只要调用这个参数就行了。
//这里如果做了大小写的转换,总控制器里面就不用了。 functionbca(){ $arr=explode('/',ltrim($_SERVER['PATH_INFO'],'/')); if(count($arr)==3){ $arr[0]=strtolower($arr[0]); $arr[1]=ucfirst(strtolower($arr[1])); //判断后缀是不是.html if(substr($arr[2],-5,strlen($arr[2]))=='.html'){ $a=explode('.',$arr['2']); $arr[2]=strtolower($a[0]); }else{ $arr[2]=strtolower($arr[2]); } $_SERVER['PATH_INFO']=$arr; } } //url方法做控制器或前后台的跳转。第三个参数是输出还是return。默认是直接输出。 functionU($string='',$method='',$bool=true){//true是直接输出或者返回, //获取系统变量。 $path_info=$_SERVER['PATH_INFO']; $script_name=$_SERVER['SCRIPT_NAME']; //判断中间有没有/以确定参数个数。 if(strpos($string,'/')){ $arr=explode('/',$string); if(count($arr)==2){//两个参数的情况。 $arr[0]=ucfirst(strtolower($arr[0])); $arr[1]=strtolower($arr[1]); $url="/{$path_info[0]}/{$arr[0]}/{$arr[1]}.html"; }elseif(count($arr)==3){//三个参数的情况。 $arr[0]=strtolower($arr[0]); $arr[1]=ucfirst(strtolower($arr[1])); $arr[2]=strtolower($arr[2]); $url="/{$arr[0]}/{$arr[1]}/{$arr[2]}.html"; } }else{ $arr=strtolower($string);//一个参数的情况。 $url="/{$path_info[0]}/{$path_info[1]}/{$arr}.html"; } //url路径的拼接。 if($method!=''){ $u=$script_name.$url.'?'.$method; if($bool==true){echo$u;}else{return$u;} }else{ $u=$script_name.$url; if($bool==true){echo$u;}else{return$u;} } }
3.url重写,去掉index.php
打开apache配置文件重写模块,LoadModulerewrite_modulemodules/mod_rewrite.so
根下加入的改写文件 .htaccess
内容:
Options+FollowSymlinks RewriteEngineOn RewriteCond%{REQUEST_FILENAME}!-d RewriteCond%{REQUEST_FILENAME}!-f RewriteRule^(.*)$index.php/$1[QSA,PT,L]
在浏览器输入url:http://mvc.com/home/index/index.html?a=19b=38
[REDIRECT_STATUS]=>200 重写状态ok。
发现$_SERVER['REDIRECT_URL'];和$_SERVER['PATH_INFO'];参数相同。所以参数后面就可以去掉index.php这安全的问题。
4.模板替换(思路)
我们会发现有一个我们书写的模板,里面有{$arr}
5.数据缓存(思路)
json_encode()json_decode()file_get_contents()file_put_contents();unserialize(); serialize();等存文文件里面或者memcacheredis等存储。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。