美工统筹SEO,为企业电子商务营销助力!
PHP仿tp完成mvc框架根基设想思绪与完成体例阐发
一佰互联网站开辟设想(www.taishanly.com) 宣布日期 2020-04-25 14:40:44 阅读数: 152
本文实例报告了PHP仿tp完成mvc框架根基设想思绪与完成体例。分享给大师供大师参考,具体以下:
仿tp mvc根基设想与简略完成
一:文件加载知识
变量 常量 函数 类文件加载的函数或利用定名空间:require();
require_once();
include();
include_once();
常量:define("DEFINE","");
const constant = "value";
函数:function fun(){}
// global 利用全局变量 部分变量不被外部挪用。类:
<?phpclass A{ public $a = 10; public function aa(){ // 不能利用一个a是由于,new A 以后 体例a会被主动履行,以是体例名不能够和类名抵触。 echo $this->a; // 输出属性. } public function __construct(){ // 机关体例,实例化后主动履行, echo $this->bb(); // 挪用体例。 } public function bb(){ echo "我是bb"; }}$a = new A;$a->aa();class B extends A{ // 担当 A ,类A是类B的父级。担当public的,}$b = new B;$b->aa(); // 能够输出类A外面的属性。
工场情势参阅://www.taishanly.com/article/140658.htm
//-----------------------------工场情势-------------------------//class A{ public $class; // public $class = $_GET["c"]; //类名 public $method; // public $method = $_GET["m"]; //体例 public function __construct($class,$method){ // 或经由过程 $_SERVER["PATH_INFO"]; 转换获得类名或体例名(上面讲授)。 $this->class = ucfirst(strtolower($class))."Controller"; //对类名停止宁静处置,并加上节制器后缀 $this->method = strtolower($method); //对体例名停止宁静处置 $this->work($this->class,$this->method); } public function work($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");new A($v,$c); // 按照担当干系再次加载文件。// extract($arr); //extract 的感化:从数组中将变量导入到以后的标记表,键做变量,值做值!// compact(); // — 成立一个数组,包含变量名和它们的值// assign display 完成参阅://www.taishanly.com/article/140661.htm
class Controller{ public $array; public $key; public $val; public function assign($key,$val){ if(array($val)){ $this->array["$key"] = $val; }else{ $this->array["$key"] = compact($val); } } public function display($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,也能够不加。class IndexModel extends Model{ public function index(){ // 数据处置。 // 须要前往数据就加上return。 }}class IndexController extends Controller{ // 担当 public function index(){ $m = Model("index"); echo "实例化后的index体例<br>"; $this->assign("m",$m); // 分派数据。 $this->display("index.html"); // 模板 }}
mvc固然完成可是不够人道化,由于每次都要加上get参数,变得很冗杂,处置的关头在于$_SERVER["PATH_INFO"];
用这个替代掉h m v三个参数。
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参数转换为数组,在节制器或其余的处所只需挪用这个参数就好了。
// 这里若是做了巨细写的转换,总节制器外面就不必了。function bca(){ $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。默许是间接输出。function U($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"; }else if(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设置装备摆设文件重写模块,LoadModule rewrite_module modules/mod_rewrite.so
根下插手的改写文件 .htaccess
内容:
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]</IfModule>
在阅读器输出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} <include file="" /> 等,咱们把模板文件读取后经由过程正则另有字符串把他转换成一般的php文件。对文件名加密后放到替代后的文件夹下,每次url拜候的时辰检查是不是是有缓存文件,判定最初点窜时候等考证,
5. 数据缓存(思绪)
json_encode()
json_decode()
file_get_contents()
file_put_contents();
unserialize();
serialize();
等存文文件外面或memcache redis 等存储。
更多对于PHP相干内容感乐趣的读者可检查本站专题:《php面向工具法式设想入门教程》、《PHP数组(Array)操纵技能大全》、《PHP根基语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操纵入门教程》及《php罕见数据库操纵技能汇总》
但愿本文所述对大师PHP法式设想有所赞助。