这篇文章主要介绍了PHP仿tp实现mvc框架基本设计思路与实现方法,简单讲述了php实现tp框架的原理,并结合实例形式分析了相关控制器、视图及URL访问操作技巧与注意事项,需要的朋友可以参考下
本文实例讲述了PHP仿tp实现mvc框架基本设计思路与实现方法。分享给大家供大家参考,具体如下:
仿tp mvc基本设计与简单实现
一:文件加载常识
变量 常量 函数 类
文件加载的函数或者使用命名空间:require();
require_once();
include();
include_once();
常量:define("DEFINE","");
const constant = "value";
函数:function fun(){}
// global 使用全局变量 局部变量不被外部调用。
类:
<?php class 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里面的属性。
工厂模式参阅:http://www.jb51.net/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 实现参阅:http://www.jb51.net/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}
5. 数据缓存(思路)
json_encode()
json_decode()
file_get_contents()
file_put_contents();
unserialize();
serialize();
等存文文件里面或者memcache redis 等存储。
相关推荐:
以上是PHP仿tp實作mvc框架基本設計想法與實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHP在現代Web開發中仍然重要,尤其在內容管理和電子商務平台。 1)PHP擁有豐富的生態系統和強大框架支持,如Laravel和Symfony。 2)性能優化可通過OPcache和Nginx實現。 3)PHP8.0引入JIT編譯器,提升性能。 4)雲原生應用通過Docker和Kubernetes部署,提高靈活性和可擴展性。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)