失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > PHP仿tp实现mvc框架基本设计思路与实现方法

PHP仿tp实现mvc框架基本设计思路与实现方法

时间:2023-07-26 20:03:11

相关推荐

PHP仿tp实现mvc框架基本设计思路与实现方法

后端开发|php教程

php,思路,设计

后端开发-php教程仿tp mvc基本设计与简单实现

jdk 1.6 源码 下载,vscode方法注释显示慢,ubuntu修改保存,tomcat部署程序升级,爬虫程序选课,mysql存储数组php,seo公司怎么操作外链,适合个人网站备案的php源码,骑士系统模板lzw

一:文件加载常识

有软件修改源码,vscode 搜索中文,ubuntu xde,tomcat 指令运行,sqlite数据破坏恢复,ecshop采集插件,适合个性化前端框架,金融贷款信息爬虫python,安卓服务器 php,seo推广哪家实惠,仿手机h5网站教程,室内设计网页模板,jquery 创建模板lzw

变量 常量 函数 类

文件加载的函数或者使用命名空间:require();require_once();include();include_once();

常量:define("DEFINE","");const constant = "value";

函数:function fun(){}// global 使用全局变量 局部变量不被外部调用。

类:

易语言日志源码,Ubuntu怎么开启网卡,python爬虫表情包,php foo(,临沂seo误区lzw

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里面的属性。

工厂模式参阅:/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 参数来解决

例如:/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 实现参阅:/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方法

; $this->assign(m,$m); // 分配数据。 $this->display(index.html); // 模板 }}

mvc虽然实现但是不够人性化,因为每次都要加上get参数,变得很冗长,解决的关键在于$_SERVER[PATH_INFO];

用这个替换掉h m v三个参数。

1. 当输入url为:/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

内容:

Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

在浏览器输入url:/home/index/index.html?a=19b=38

[REDIRECT_STATUS] => 200 重写状态ok。

发现$_SERVER[REDIRECT_URL];$_SERVER[PATH_INFO];参数相同。所以参数后面就可以去掉index.php这安全的问题。

4. 模板替换(思路)

我们会发现有一个我们书写的模板,里面有 {$arr} 等,我们把模板文件读取后通过正则还有字符串把他转换成正常的php文件。对文件名加密后放到替换后的文件夹下,每次url访问的时候查看是否有缓存文件,判断最后修改时间等验证,

5. 数据缓存(思路)

json_encode()json_decode()file_get_contents()file_put_contents();unserialize();serialize();等存文文件里面或者memcache redis 等存储。

ThinkPHP框架实现的MySQL数据库备份功能

如果觉得《PHP仿tp实现mvc框架基本设计思路与实现方法》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。