`5.0`版本和之前版本的差異較大,本篇對熟悉`3.2`版本的用戶給出了一些`5.0`的主要區別。
## URL和路由
`5.0`的URL訪問不再支持普通`URL`模式,路由也不支持正則路由定義,而是全部改為規則路由配合變量規則(正則定義)的方式:
主要改進如下;
- 增加路由變量規則;
- 增加組合變量支持;
- 增加資源路由;
- 增加路由分組;
- 增加閉包定義支持;
- 增加MISS路由定義;
- 支持URL路由規則反解析;
## 請求對象和響應對象
`5.0`新增了請求對象`Request`和響應對象`Response`,`Request`統一處理請求和獲取請求信息,`Response`對象負責輸出客戶端或者瀏覽器響應。
## 模塊和控制器
控制器的命名空間有所調整,并且可以無需繼承任何的控制器類。
- 應用命名空間統一為`app`(可定義)而不是模塊名;
- 控制器的類名默認不帶`Controller`后綴,可以配置開啟`use_controller_suffix`參數啟用控制器類后綴;
- 控制器操作方法采用`return`方式返回數據 而非直接輸出;
- 廢除原來的操作前后置方法;
- 增加`beforeActionList`屬性定義前置操作;
- 支持任意層次的控制器定義和訪問;
- URL訪問支持自動定位控制器;
## 數據庫
5.0的數據庫查詢功能增強,原先需要通過模型才能使用的鏈式查詢可以直接通過`Db`類調用,原來的`M`函數調用可以改用`db`函數,例如:
### 3.2版本
```
<pre class="calibre18">
```
M(<span class="hljs-string">'User'</span>)->where([<span class="hljs-string">'name'</span>=><span class="hljs-string">'thinkphp'</span>])->find();
```
```
### 5.0版本
```
<pre class="calibre18">
```
db(<span class="hljs-string">'User</span>')-><span class="hljs-keyword">where</span>(<span class="hljs-string">'name</span><span class="hljs-string">','</span>thinkphp')->find();
```
```
主要改進如下:
- 支持鏈式查詢操作;
- 數據查詢支持返回對象、數組和`PDOStatement`對象;
- 數據集查詢支持返回數組和`Collection`對象;
- 增加查詢構造器,查詢語法改變;
- 支持閉包查詢;
- 支持分塊查詢;
- 支持視圖查詢;
- 增加SQL監聽事件;
## 模型
`5.0`的模型變化是最大的,基本上模型是完全面向對象的概念,包括關聯模型,模型類的后綴不再帶`Model`,直接由命名空間區分,原來的`D`函數調用改為`model`函數,并且必須創建對應的模型類,例如:
### 3.2版本
```
<pre class="calibre18">
```
D(<span class="hljs-string">'User'</span>)->where([<span class="hljs-string">'name'</span>=><span class="hljs-string">'thinkphp'</span>])->find();
```
```
### 5.0版本
```
<pre class="calibre18">
```
model(<span class="hljs-string">'User</span>')-><span class="hljs-keyword">where</span>(<span class="hljs-string">'name</span><span class="hljs-string">','</span>thinkphp')->find();
```
```
主要改進包括:
- 重構關聯模型;
- 支持聚合模型;
- 廢除視圖模型(改為數據庫的視圖查詢方法);
- 模型的擴展采用`Trait`機制;
- 增加獲取器和修改器;
- 增加時間戳自動寫入;
- 增加類型字段轉換;
- 數組訪問支持;
- JSON序列化支持;
## 自動驗證和自動完成
5.0的數據自動驗證和自動完成和3.2版本區別較大,5.0的數據驗證采用驗證器定義并且通過`think\Validate`類進行統一的驗證。自動完成則通過在模型里面定義修改器來完成。
## 異常
`5.0`對錯誤零容忍,默認情況下會對任何級別的錯誤拋出異常(但可以在應用公共文件中設置錯誤級別),并且重新設計了異常頁面,展示了詳盡的錯誤信息,便于調試。
## 調試和日志
`5.0`的頁面`Trace`強化,支持瀏覽器控制臺查看Trace信息。
`5.0`的日志驅動增加`Socket`方式,采用`SocketLog`支持遠程調試。
## 常量
`5.0`版本廢棄了原來的大部分常量定義,僅僅保留了框架的路徑常量定義,其余的常量可以使用`App`類或者`Request`類的相關屬性或者方法來完成,或者自己重新定義需要的常量。
廢除的常量包括:
```
<pre class="calibre18">
```
REQUEST<span class="hljs-operator">_METHOD IS_</span>GET IS<span class="hljs-operator">_POST IS_</span>PUT IS<span class="hljs-operator">_DELETE IS_</span>AJAX <span class="hljs-operator">__EXT__</span> COMMON<span class="hljs-operator">_MODULE MODULE_</span>NAME CONTROLLER<span class="hljs-operator">_NAME ACTION_</span>NAME APP<span class="hljs-operator">_NAMESPACE APP_</span>DEBUG MODULE_PATH
```
```
## 函數
`5.0`版本核心框架不依賴任何自定義函數,但仍然封裝了一些常用功能到助手函數,你可以隨意重新定義或者增加助手函數。
- 脕茫隆壟脨貌脩脭
- 脕茫隆壟脨貌脩脭
- 脪祿隆壟祿霉麓隆
- 脪祿隆壟祿霉麓隆
- 露鎂隆壟URL潞脥脗路脫脡
- 露鎂隆壟URL潞脥脗路脫脡
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脣脛隆壟脢媒戮脻驢芒
- 脣脛隆壟脢媒戮脻驢芒
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脕霉隆壟脛攏脨脥潞脥鹿脴脕陋
- 攏簍1攏漏脛攏脨脥露簍脪氓
- 攏簍2攏漏祿霉麓隆虜脵脳梅
- 攏簍3攏漏露脕脠隆脝梅潞脥脨脼賂脛脝梅
- 攏簍4攏漏脌脿脨脥脳陋祿祿潞脥脳脭露爐脥錨魯脡
- 攏簍5攏漏虜茅脩爐路露脦摟
- 攏簍6攏漏脢盲脠毛潞脥脩茅脰隴
- 攏簍7攏漏鹿脴脕陋
- 攏簍8攏漏脛攏脨脥脢盲魯枚
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 戮脜隆壟API驢陋路壟
- 戮脜隆壟API驢陋路壟
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬露鎂隆壟脭脫脧卯
- Cookie
- Session
- 碌樓脭陋虜芒脢脭
- 脥錄脧帽麓婁脌鉚
- 脦脛錄鎂脡脧麓蘆
- 脩茅脰隴脗毛
- 賂陸脗錄
- A隆壟魯攏錄沒脦脢脤芒錄爐
- B隆壟3.2潞脥5.0脟酶鹵冒
- C隆壟脰煤脢脰潞爐脢媒
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝