手把手编写自己的PHP MVC框架实例教程
1 什么是MVC
MVC模式 (Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。
简而言之,
- 模型Model – 管理所有 数据库 相关的逻辑。模型提供了连接和操作数据库的抽象层。
- 控制器Controller - 负责所有的 业务逻辑 ,比如 if/else 逻辑。
- 视图View – 负责界面显示,如HMTL/XML/JSON显示。
2 为什么要自己开发MVC框架
网络上有大量优秀的MVC框架可供使用,本教程并不是为了开发一个全面的、终极的MVC框架解决方案,而是将它看作是一个很好的从内部学习PHP的机会,在此过程中,你将学习 面向对象编程 和 MVC设计模式 ,并学习到开发中的一些注意事项。
更重要的是,你可以完全控制你的框架,并将你的想法融入到你开发的框架中。虽然不一定是做好的,但是你可以按照你的方式去开发功能和模块。
3 开始开发自己的MVC框架
3.1 目录准备
在开始开发前,让我们先来把项目建立好,假设我们建立的项目为 todo,MVC的框架可以命名为 FastPHP,那么接下来的第一步就是把目录结构先设置好。
虽然在这个教程中不会使用到上面的所有的目录,但是为了以后程序的可拓展性,在一开始就把程序目录设置好使非常必要的。下面就具体说说每个目录的作用:
- application – 应用代码
- config – 程序配置或数据库配置
- fastphp - 框架核心目录
- public – 静态文件
- runtime - 临时数据目录
- scripts – 命令行工具
3.2 代码规范
在目录设置好以后,我们接下来就要来规定一下代码的规范:
- MySQL的表名需 小写 ,如:item,car
- 模块名(Models)需 首字母大写 ,,并在名称后添加“Model”,如:ItemModel,CarModel
- 控制器(Controllers)需 首字母大写 ,,并在名称中添加“Controller”,如:ItemsController,CarsController
- 视图(Views)部署结构为“控制器名/行为名”,如:item/view.php,car/buy.php
上述的一些规则是为了能在程序中更好的进行互相的调用。接下来就开始真正的PHP MVC编程了。
3.3 重定向
将所有的数据请求都重定向 index.php 文件,在 todo 目录下新建一个 .htaccess 文件,文件内容为:
1 |
|
这样做的主要原因有:
- 程序有一个单一的入口;
- 除静态程序,其他所有程序都重定向到 index.php 上;
- 可以用来生成利于SEO的URL,想要更好的配置URL,后期可能会需要URL路由,这里先不做介绍了。
3.4 入口文件
做完上面的操作,就应该知道我们需要做什么了,没错!在 public 目录下添加 index.php 文件,文件内容为:
1 |
|
注意,上面的PHP代码中,并没有添加PHP结束符号”?>”,这么做的主要原因是, 对于只有 PHP 代码的文件,结束标志(“?>”)最好不存在,PHP自身并不需要结束符号,不添加结束符号可以很大程度上防止末尾被添加额外的注入内容,让程序更加安全。
3.5 配置文件和主请求
在 index.php 中,我们对 fastphp 文件夹下的 FastPHP.php 发起了请求,那么 FastPHP.php 这个启动文件中到底会包含哪些内容呢?
1 |
|
以上文件都其实可以直接在 index.php 文件中包含,常量也可以直接在 index.php 中定义,我们这么做的原因是为了在后期管理和拓展中更加的方便,所以把需要在一开始的时候就加载运行的程序统一放到一个单独的文件中引用。
先来看看config文件下的 config .php 文件,该文件的主要作用是设置一些程序的配置项及数据库连接等,主要内容为:
1 |
|
应该说 config.php 涉及到的内容并不多,不过是一些 基础数据库 的设置,再来看看 fastphp下的共用框架入口文件 Core.php 应该怎么写。
1 |
|
下面重点讲解主请求方法 callHook(),首先我们想看看我们的 URL 会这样:
1 |
|
callHook()的作用就是,从全局变量 $_GET['url']变量中获取 URL,并将其分割成三部分:$controller、$action 和 $queryString。
例如,URL链接为: todo.com/item/view/1/first-item ,那么
- $controller 就是: items
- $action 就是: view
- 查询字符串Query String就是: array(1, first-item)
分割完成后,会实例化一个新的控制器: $controller.'Controller' (其中“.”是连字符),并调用其方法 $action。
3.6 控制器/Controller基类
接下来的操作就是在 fastphp 中建立程序所需的基类,包括 控制器 、 模型 和 视图 的基类。
新建控制器基类为 Controller.class.php ,控制器的主要功能就是总调度,具体具体内容如下:
1 |
|
Controller 类实现所有控制器、模型和视图(View类)的通信。在执行析构函数时,我们可以调用 render() 来显示视图(view)文件。
3.7 模型Model基类
新建模型基类为 Model.class.php ,模型基类 Model.class.php 代码如下:
1 |
|
考虑到模型需要对 数据库 进行处理,所以单独建立一个数据库基类 Sql.class.php ,模型基类继承 Sql.class.php,代码如下:
1 |
|
应该说, Sql.class.php 是框架的核心部分 。为什么?因为通过它,我们创建了一个 SQL 抽象层,可以大大减少了数据库的编程工作。connect() 和 disconnect() 方法比较简单,不多做说明,重点讲讲 Query查询。假设我们有如下的一段 SQL 查询语句:
1 |
|
如果使用上面的 SQL 基类,首先要做的工作是选出要输出的字段以及相对应的数据表,然后把它们放到数组中,其中,$field 和 $table 使用相同的索引值。在上面的例子中,它们是这样的:
1 |
|
脚本会展开所有的数据行,并将数据表转换成一个模型名(如去除复数和首字母大写)。查询结果最终保存在一个多维数组中,然后返回,格式类似于: $var['modelName']['fieldName'] 。这样输出方式可以非常便于在视图中使用这些元素。
3.8 视图View类
视图类 View.class.php 内容如下:
1 |
|
这样我们的核心的PHP MVC框架就编写完成了,下面我们开始编写应用来测试框架功能。
4 应用
4.1 数据库部署
在 SQL 中新建一个 todo 数据库,使用下面的语句增加 item 数据表并插入2条记录:
1 |
|
4.2 部署模型
然后,我们还需要在 models 目录中创建一个 ItemModel.php 模型,内容如下:
1 |
|
模型内容为空。因为 Item 模型继承了 Model,所以它拥有 Model 的所有功能。
4.3 部署控制器
在 controllers 目录下创建一个 ItemsController.php 控制器,内容如下:
1 |
|
4.4 部署视图
在 views 目录下新建 header.php 和 footer.php 两个页头页脚模板,内容如下。
header.php ,内容:
1 |
|
footer.php ,内容:
1 |
|
然后,在 views/item 创建以下几个视图文件。
index.php ,浏览数据库内 item 表的所有记录,内容:
1 |
|
add.php ,添加记录,内容:
1 |
|
view.php ,查看单条记录,内容:
1 |
|
update.php ,更改记录,内容:
1 |
|
delete.php ,删除记录,内容:
1 |
|
4.5 应用测试
这样,在浏览器中访问 todo 程序: http://localhost/todo/item/index/ ,就可以看到效果了。
以上代码全部发布到了我的 github 上,代码仓地址: https://github.com/yeszao/FastPHP ,欢迎克隆、提交。
本文参考:
- http://anantgarg.com/2009/03/13/write-your-own-php-mvc-framework-part-1/

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

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

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

在PHPOOP中,self::引用當前類,parent::引用父類,static::用於晚靜態綁定。 1.self::用於靜態方法和常量調用,但不支持晚靜態綁定。 2.parent::用於子類調用父類方法,無法訪問私有方法。 3.static::支持晚靜態綁定,適用於繼承和多態,但可能影響代碼可讀性。

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。
