`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碌脛脮媒脠路脳脣脢脝