# `ThinkPHP5.0`常见问题集
整理了下ThinkPHP`5.0`的常见问题(不断更新中~),希望给新手和习惯了`3.2`版本的用户带来帮助吧,类似的问题在V5交流群里面一天要问个百八次的 ^\_^
- - [为什么5.0取消了很多常量?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#-5-0-)
- [为啥单字母函数去掉了?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#-)
- [数据库查询和模型怎么用?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#--1)
- [关于配置参数的问题](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#u5173u4E8Eu914Du7F6Eu53C2u6570u7684u95EEu9898)
- [怎么才能在控制器中正确的输出模板](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#u600Eu4E48u624Du80FDu5728u63A7u5236u5668u4E2Du6B63u786Eu7684u8F93u51FAu6A21u677F)
- [没有创建模型类怎么查询?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#--2)
- [原来3.2版本的模型的getField方法应该如何使用?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#-3-2-code-getfield-code-)
- [5.0怎么没有编译缓存了?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#5-0-)
- [为什么写入数据的时候不会自动去除数据库没有的字段?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#--3)
- [为什么不能识别驼峰法命名的控制器](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#u4E3Au4EC0u4E48u4E0Du80FDu8BC6u522Bu9A7Cu5CF0u6CD5u547Du540Du7684u63A7u5236u5668)
- [5.0的类库定义可以带上后缀么?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#-code-5-0-code-)
- [5.0怎么实现模板输出的特殊字符串替换?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#-code-5-0-code--1)
- [5.0的fetch和display方法有什么区别?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#5-0-fetch-display-)
- [为什么Session无法获取?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#-session-)
- [为什么无法接收表单数组类型数据?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#--4)
- [为什么模型的查询返回的都是对象而不是数组](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#u4E3Au4EC0u4E48u6A21u578Bu7684u67E5u8BE2u8FD4u56DEu7684u90FDu662Fu5BF9u8C61u800Cu4E0Du662Fu6570u7EC4)
- [为什么Input类没有了?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#-code-input-code-)
- [原来的模板标签怎么不能用了?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#--5)
- [5.0模型的save方法如何过滤非数据表字段值?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#5-0-code-save-code-)
- [为什么路由变量用$\_GET获取不到?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#-code-e126ed-e95eget-code-)
- [如何关闭未定义变量的错误提示?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#--6)
- [如何获取当前的模块、控制器和操作名](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#--7)
- [如何让生成的URL地址带上index.php](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#-url-index-php)
- [模型类的field属性和type属性有什么区别?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#-code-field-code-code-type-code-)
- [模型的save方法调用后怎么获取自增主键的值?](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145260#-save-)
## 为什么5.0取消了很多常量?
核心使用太多的常量不利于单元测试以及今后的组件化设计,目前`5.0`版本仅仅保留了核心的路径常量,其它常量均改为通过`Request`请求对象的方法获取(有个别常量则废除)。
如果觉得不习惯或者项目迁移需要,也可以在应用里面自己重新定义这些常量。
## 为啥单字母函数去掉了?
单字母函数是TP历史上争议较大的问题,应该说单字母函数的诞生是有历史原因的,但已经到了退出历史舞台的时候了,可能很多人习惯了单字母函数带来的便捷(虽然同时我们也饱受着某些学院用户的抱怨)。
基于几个原因废除了单字母函数:
(1)5.0 核心已经不依赖任何函数 只是对常用的操作封装提供了助手函数
(2)助手函数是可以完全自己定义和修改,并不影响其他的使用
(3)现在的IDE提示和自动完成功能已经非常强大了,所以用不用助手函数,或者是否需要改成原来的单字母函数,全凭开发者个人意愿。
核心框架不依赖任何助手函数,系统只是默认加载了助手函数,配置如下:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 扩展函数文件定义</span><span class="hljs-string">'extra_file_list'</span> => [THINK_PATH . <span class="hljs-string">'helper'</span> . EXT],
```
```
因此,你可以随意修改助手函数的名称或者添加自己的助手函数,然后修改配置为:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 扩展函数文件定义</span><span class="hljs-string">'extra_file_list'</span> => [ APP_PATH . <span class="hljs-string">'helper'</span> . EXT],
```
```
## 数据库查询和模型怎么用?
官方开发手册的所有示例代码为了简洁明了,省略了所有 think 命名空间的类调用,也就是说 如果示例里面的代码是
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-title1">Db</span>:<span class="hljs-string">:<span class="hljs-function">table</span>(<span class="hljs-operator">'think_user'</span>)-><span class="hljs-function">select</span>()</span></span>;
```
```
那么其实正确的姿势应该是
```
<pre class="calibre18">
```
\<span class="hljs-regexp">think</span>\<span class="hljs-operator"><span class="hljs-title1">Db</span>:<span class="hljs-string">:<span class="hljs-function">table</span>(<span class="hljs-operator">'think_user'</span>)-><span class="hljs-function">select</span>()</span></span>;
```
```
或者首先
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-keyword">use</span> think\Db;</span>
```
```
然后
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-title1">Db</span>:<span class="hljs-string">:<span class="hljs-function">table</span>(<span class="hljs-operator">'think_user'</span>)-><span class="hljs-function">select</span>()</span></span>;
```
```
这里,我首先要说声抱歉,3.2的函数封装方式某种意义上掩盖了命名空间的调用问题,让大家感觉不到命名空间的存在意义和调用机制,傻瓜式地在使用,如果5.0还不能让你们清醒认识并掌握到命名空间应该是怎么调用的话,那么我奉劝你可以退出开发者的行列了。
下面来说说关于数据查询的问题,原来在模型里面的数据查询,现在Db类都能完成,新的模型类的查询返回的都是模型对象,例如:
```
<pre class="calibre18">
```
$<span class="hljs-operator">user</span> = <span class="hljs-operator">User</span>::get(1);
$<span class="hljs-operator">user</span> = <span class="hljs-operator">User</span>::find();
```
```
模型的查询返回的都是模型对象实例,每个模型拥有自己的属性和方法。
## 关于配置参数的问题
很多的配置参数或者配置层次都和之前不同了,有疑问的时候可以直接看框架目录下面的`convention.php`文件,或者完全开发手册中的[附录:配置参数](http://ihavenolimitations.xyz/manual/thinkphp5/118136)。都列出了完整的配置参数。
## 怎么才能在控制器中正确的输出模板
5.0在控制器中输出模板,使用方法如下:
如果你的控制器继承了 `think\Controller`的话,使用:
```
<pre class="calibre18">
```
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->fetch(<span class="hljs-string">'index/hello'</span>);
```
```
如果你没有继承`think\Controller`的话,可以使用:
```
<pre class="calibre18">
```
<span class="hljs-number">return</span> view(<span class="hljs-string">'index/hello'</span>);
```
```
## 没有创建模型类怎么查询?
原先版本的M方法可以支持不用创建类进行查询,新版如何处理呢?
首先,我们要搞明白一个,查询是`Db`类的事情,如果只是查询数据表的数据到一个数组,那么直接使用
```
<pre class="calibre18">
```
Db::table(<span class="hljs-string">'think_user'</span>)->select();
<span class="hljs-comment">// 或者</span>
Db::name(<span class="hljs-string">'user'</span>)->select();
```
```
就可以了,如果你要返回一个模型对象(为啥要对象 这个可能目前你还不一定能理解),则使用下面的方式:
创建一个`User`模型类 然后:
```
<pre class="calibre18">
```
$<span class="hljs-operator">user</span> = <span class="hljs-operator">User</span>::get(1);
```
```
或者使用:
```
<pre class="calibre18">
```
<span class="hljs-regexp">$user</span> = <span class="hljs-keyword">new</span> User;
<span class="hljs-regexp">$data</span> = <span class="hljs-regexp">$user</span>->where(<span class="hljs-string">'id'</span>,<span class="hljs-number">1</span>)->find();
```
```
## 原来3.2版本的模型的`getField`方法应该如何使用?
原先模型类的`getField`方法,在5.0的数据库`Query`类中拆分成两个方法,一个`value`方法用于查询某个行的某个值和一个`column`方法用于查询某个列的值,用法如下:
查询某个字段的值可以用
```
<pre class="calibre18">
```
<span class="hljs-comment">// 返回某个字段的值</span>
Db::table(<span class="hljs-string">'think_user</span>')-><span class="hljs-keyword">where</span>(<span class="hljs-string">'id</span>',<span class="hljs-number">1</span>)->value(<span class="hljs-string">'name</span>');
```
```
原先的聚合查询方法依然有效,例如:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 查询用户数</span>
Db::table(<span class="hljs-string">'think_user'</span>)->count();
<span class="hljs-comment">// 查询用户的最高分</span>
Db::table(<span class="hljs-string">'think_user'</span>)->max(<span class="hljs-string">'score'</span>);
```
```
查询某一列的值可以用
```
<pre class="calibre18">
```
<span class="hljs-comment">// 返回数组</span>
Db::table(<span class="hljs-string">'think_user</span>')-><span class="hljs-keyword">where</span>(<span class="hljs-string">'status</span>',<span class="hljs-number">1</span>)->column(<span class="hljs-string">'name</span>');
<span class="hljs-comment">// 指定id字段作为索引</span>
Db::table(<span class="hljs-string">'think_user</span>')-><span class="hljs-keyword">where</span>(<span class="hljs-string">'status</span>',<span class="hljs-number">1</span>)->column(<span class="hljs-string">'name</span><span class="hljs-string">','</span>id');
```
```
## 5.0怎么没有编译缓存了?
> 编译缓存的基础原理是第一次运行的时候把核心需要加载的文件去掉空白和注释后合并到一个文件中,第二次运行的时候就直接载入编译缓存而无需载入众多的核心文件。
编译缓存是`ThinkPHP`从诞生开始就存在的特色功能,但同时也是困扰很多新手的问题,经常由于不记得清空编译缓存而导致一些莫名其妙的问题。`5.0`开始,由于架构的重新设计框架性能已经获得了很大的提升,加上`PHP`本身的`opcode`的优化,尤其是即将迎来`PHP7`的时代,所以决定废除编译缓存机制。
## 为什么写入数据的时候不会自动去除数据库没有的字段?
ThinkPHP一直以来都支持自动去除数据库没有的字段,`5.0`版本出于更加严谨的考虑,默认情况下当写入数据库不存在的字段的时候会抛出字段不存在的异常,有两种方法可以避免异常。
第一种,在数据库配置文件或者传入connect方法的连接参数中设置关闭严格检查:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 关闭严格检查字段是否存在</span><span class="hljs-string">'fields_strict'</span> => <span class="hljs-keyword">false</span>,
```
```
这种方式全局有效。
第二种,在查询的时候使用strict方法指定是否进行严格检测字段
```
<pre class="calibre18">
```
<span class="hljs-comment">// 使用strict方法关闭字段严格检测</span>
Db::name(<span class="hljs-string">'user'</span>)->strict(<span class="hljs-keyword">false</span>)->insert(<span class="hljs-regexp">$data</span>);
```
```
该方法仅针对当前查询有效。
## 为什么不能识别驼峰法命名的控制器
5.0版本默认情况下不区分URL的大小写,也就是说URL里面的控制器和操作都会强制转小写然后去定位控制器类,因此
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//serverName/index/UserType/addType</span>
<span class="hljs-comment">// 和下面的访问是等效的</span>
<span class="hljs-string">http:</span>
<span class="hljs-comment">//serverName/index/usertype/addtype</span>
```
```
最终访问的其实都是`Usertype`控制器类的`addtype`方法。
如果需要访问驼峰法命名的`UserType`控制器,有两种方式:
一、使用下面的URL地址访问
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//serverName/index/user_type/addtype</span>
```
```
二、配置`url_convert`参数,关闭URL强制转换
```
<pre class="calibre18">
```
<span class="hljs-comment">// 关闭自动转换</span><span class="hljs-string">'url_convert'</span> => <span class="hljs-keyword">false</span>,
```
```
一旦关闭URL自动转换后,URL访问就区分大小写了
要访问`UserType`控制器类的操作,必须使用:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//serverName/index/UserType/addType</span>
```
```
下面的访问地址都是无效的:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//serverName/index/Usertype/addtype</span>
<span class="hljs-string">http:</span>
<span class="hljs-comment">//serverName/index/usertype/addtype</span>
```
```
但下面的访问地址仍然有效:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//serverName/index/user_type/addtype</span>
```
```
## `5.0`的类库定义可以带上后缀么?
因为有了命名空间,默认配置下,5.0的类库都不再和3.2版本一样加上`Controller`、`Model`之类的后缀了,如果仍然希望采用这种方式命名类库的话,两种方式可以配置:
一、单独配置控制器类的后缀
```
<pre class="calibre18">
```
<span class="hljs-comment">// 控制器类后缀</span><span class="hljs-string">'controller_suffix'</span> => <span class="hljs-keyword">true</span>,
```
```
这样所有的控制器类定义必须加上`Controller`后缀。
二、配置所有类库的后缀
```
<pre class="calibre18">
```
<span class="hljs-comment">// 开启应用类库后缀</span><span class="hljs-string">'class_suffix'</span> => <span class="hljs-keyword">true</span>,
```
```
开启以后,所有的应用类库都需要加上对应的后缀,包括控制器类、模型类及验证器类等等,以`User`控制器/模型/验证器类为例就是:
```
<pre class="calibre18">
```
<span class="hljs-title">UserController</span>
UserModel
UserValidate
```
```
> 如果使用助手函数或者Loader类的方法实例化的话,不需要加上后缀,会自动识别当前的配置参数决定是否需要添加后缀。
## `5.0`怎么实现模板输出的特殊字符串替换?
`5.0`版本仍然支持模板及输出的特殊字符串替换功能,只是默认不再内置任何的替换规则,需要替换的时候,可以使用`View`类的`replace`方法或者全局配置`view_replace_str`参数。
```
<pre class="calibre18">
```
<span class="hljs-comment">// 视图输出字符串内容替换</span><span class="hljs-string">'view_replace_str'</span> => [
<span class="hljs-string">'__ROOT__'</span> => <span class="hljs-string">''</span>,
<span class="hljs-string">'__PUBLIC__'</span> => <span class="hljs-string">'/public'</span>,
],
```
```
## 5.0的fetch和display方法有什么区别?
5.0模板渲染提供了`fetch`和`display`两个方法,最常用的是`fetch`方法用于渲染模板文件输出,而`display`方法则是渲染内容输出。
```
<pre class="calibre18">
```
<span class="hljs-comment">// 渲染模板输出</span><span class="hljs-regexp">$this</span>->fetch(<span class="hljs-regexp">$template</span>);
<span class="hljs-comment">// 渲染内容输出</span><span class="hljs-regexp">$this</span>->display(<span class="hljs-regexp">$content</span>);
```
```
两个方法的共同点是都支持模板或者内容的标签解析。
## 为什么Session无法获取?
`5.0`默认并没有初始化和启动`Session`,而是按需调用,只有在调用`Session`类的时候才会进行初始化,但如果你直接操作`$_SESSION`数组的话,则需要自己手动初始化或者启动`session`,方法如下:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 进行session初始化</span><span class="hljs-string">Session:</span>:init();
<span class="hljs-comment">// 或者直接调用</span>
session_start();
```
```
## 为什么无法接收表单数组类型数据?
如果你使用框架的`Request`类或者`input`助手函数获取表单数据的话,需要使用变量修饰符`/a`才能正确获取数组类型的数据,例如:
```
<pre class="calibre18">
```
<span class="hljs-title">input</span>('get.<span class="hljs-operator"><span class="hljs-keyword">data</span>/a');</span><span class="hljs-operator">Request</span>::<span class="hljs-keyword">instance</span>()->get('<span class="hljs-operator"><span class="hljs-keyword">data</span>/a');</span>
```
```
否则,默认会当作字符串接收而报错。
但是如果获取完整数据则不需要加上`/a`修饰符,例如:
```
<pre class="calibre18">
```
input(<span class="hljs-comment">'get./a');</span><span class="hljs-number">Request</span>::instance()-><span class="hljs-keyword">get</span>();
```
```
## 为什么模型的查询返回的都是对象而不是数组
5.0的设计就是`Db`类查询返回数组,模型类查询则返回当前模型的对象实例。模型采用的是对象化设计,查询的结果是一个对象,你可以进行一些额外的操作,比如调用模型的属性(字段)、业务方法,同时该模型对象仍然可以当成数组一样操作,例如:
```
<pre class="calibre18">
```
<span class="hljs-regexp">$user</span> = User::get(<span class="hljs-number">10</span>);
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->email;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->name;
<span class="hljs-regexp">$user</span>->email = <span class="hljs-string">'thinkphp@qq.com'</span>;
<span class="hljs-regexp">$user</span>->save();
```
```
或者使用数组方式操作
```
<pre class="calibre18">
```
<span class="hljs-regexp">$user</span> = User::get(<span class="hljs-number">10</span>);
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>[<span class="hljs-string">'email'</span>];
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>[<span class="hljs-string">'name'</span>];
<span class="hljs-regexp">$user</span>[<span class="hljs-string">'email'</span>] = <span class="hljs-string">'thinkphp@qq.com'</span>;
<span class="hljs-regexp">$user</span>->save();
```
```
## 为什么`Input`类没有了?
为了保持统一的入口,5.0的`Input`类的相关方法已经并入`Request`类,`Request`类作为当前的请求对象统一接收和处理,并且需要注意,不要在程序里面手动操作`$_GET`、`$_POST`和`$_REQUEST`等全局变量,这样会导致和Request请求对象的获取不一致。
具体使用请参考第七章 请求和响应,或者查看官方的开发手册。
## 原来的模板标签怎么不能用了?
5.0版本的模板标签界定符由原来的`<>` 更改为`{}`,主要是为了解决很多IDE无法解析导致提示错误的问题,例如:
原来的写法
```
<pre class="calibre18">
```
<volist name=<span class="hljs-string">"list"</span> id=<span class="hljs-string">"vo"</span>>
{<span class="hljs-regexp">$vo</span>.id}:{<span class="hljs-regexp">$vo</span>.name}
</volist>
```
```
需要改为
```
<pre class="calibre18">
```
{volist name=<span class="hljs-string">"list"</span> id=<span class="hljs-string">"vo"</span>}
{<span class="hljs-regexp">$vo</span>.id}:{<span class="hljs-regexp">$vo</span>.name}
{/volist}
```
```
或者也可以直接修改配置更改标签界定符:
```
<pre class="calibre18">
```
<span class="hljs-string">'template'</span> => [
<span class="hljs-comment">// 模板引擎类型 支持 php think 支持扩展</span><span class="hljs-string">'type'</span> => <span class="hljs-string">'Think'</span>,
<span class="hljs-comment">// 模板引擎普通标签开始标记</span><span class="hljs-string">'tpl_begin'</span> => <span class="hljs-string">'{'</span>,
<span class="hljs-comment">// 模板引擎普通标签结束标记</span><span class="hljs-string">'tpl_end'</span> => <span class="hljs-string">'}'</span>,
<span class="hljs-comment">// 标签库标签开始标记</span><span class="hljs-string">'taglib_begin'</span> => <span class="hljs-string">'<'</span>,
<span class="hljs-comment">// 标签库标签结束标记</span><span class="hljs-string">'taglib_end'</span> => <span class="hljs-string">'>'</span>,
],
```
```
## 5.0模型的`save`方法如何过滤非数据表字段值?
3.2模型类的`create`是一个很神奇的方法,实现了数据字段自动过滤,自动验证和自动完成,5.0里面应该如何实现同样的功能?
5.0使用模型的`allowField`方法可以在使用`save`方法的时候过滤非数据表字段,例如:
```
<pre class="calibre18">
```
<span class="hljs-regexp">$user</span> = <span class="hljs-keyword">new</span> User;
<span class="hljs-regexp">$user</span>->allowField(<span class="hljs-keyword">true</span>)->save(<span class="hljs-regexp">$_POST</span>);
```
```
或者指定字段写入:
```
<pre class="calibre18">
```
<span class="hljs-regexp">$user</span> = <span class="hljs-keyword">new</span> User;
<span class="hljs-regexp">$user</span>->allowField([<span class="hljs-string">'email'</span>,<span class="hljs-string">'name'</span>])->save(<span class="hljs-regexp">$_POST</span>);
```
```
## 为什么路由变量用`$_GET`获取不到?
5.0版本的变量获取界限有调整,路由变量以及`pathinfo`地址参数是不能使用$\_GET方式获取的,例如:
注册了下面的路由地址:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-title1">Route</span>:<span class="hljs-string">:<span class="hljs-function">Rule</span>(<span class="hljs-operator">'hello/:name'</span>,<span class="hljs-operator">'index/hello'</span>)</span></span>;
```
```
然后,访问下面的URL地址:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//serverName/hello/thinkphp/id/8</span>
```
```
使用 $\_GET\['name'\]、$\_GET\['id'\] 或者 input('get.name') 、input('get.id')是不能正确获取到变量的,正确的方式是:
```
<pre class="calibre18">
```
input(<span class="hljs-string">'name'</span>);
input(<span class="hljs-string">'id'</span>);
<span class="hljs-comment">// 或者</span>
request()->param(<span class="hljs-string">'name'</span>);
request()->param(<span class="hljs-string">'id'</span>);
```
```
> Request类的param方法用于获取**当前请求**的变量,而get方法是用于获取$\_GET变量,而pathinfo地址中的参数是不属于GET变量范畴的。
## 如何关闭未定义变量的错误提示?
本着严谨的原则,5.0版本默认情况下会对任何错误(包括警告错误)抛出异常,如果不希望如此严谨的抛出异常,可以在**应用公共函数文件**中或者**应用配置文件**中使用`error_reporting`方法设置错误报错级别(请注意,在入口文件中设置是无效的),例如:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 设置异常错误报错级别 关闭notice错误</span>
error_reporting(E_ALL ^ E_NOTICE );
```
```
## 如何获取当前的模块、控制器和操作名
5.0版本取消了原来的代表当前模块、控制器和操作名的常量,如果需要获取这些,可以改成:
```
<pre class="calibre18">
```
// 当前模块名
<span class="hljs-function"><span class="hljs-title">request</span><span class="hljs-number">()</span>-></span><span class="hljs-operator">module</span>();
// 当前控制器名
<span class="hljs-function"><span class="hljs-title">request</span><span class="hljs-number">()</span>-></span><span class="hljs-operator">controller</span>();
// 当前操作名
<span class="hljs-function"><span class="hljs-title">request</span><span class="hljs-number">()</span>-></span><span class="hljs-operator">action</span>();
```
```
如果需要在模板里面输出,则可以使用:
```
<pre class="calibre18">
```
{<span class="hljs-regexp">$Request</span>.<span class="hljs-keyword">module</span>}
{<span class="hljs-regexp">$Request</span>.controller}
{<span class="hljs-regexp">$Request</span>.action}
```
```
如果觉得不方便,也可以自己在模块的公共文件里面重新定义常量后操作。
## 如何让生成的URL地址带上index.php
5.0使用url方法生成的URL地址不带index.php,如果你的服务器环境不支持URL重写,那么可以使用下面的方式:
\\think\\Url::root('/index.php');
\\think\\Url::build('index/hello');
就会生成带`index.php`的URL地址了。
## 模型类的`field`属性和`type`属性有什么区别?
5.0的模型类`field`属性用于定义模型对应数据表的字段信息(包括字段类型),这里定义的字段类型是数据表的实际字段类型,例如:
```
<pre class="calibre18">
```
<span class="hljs-keyword">protected</span> <span class="hljs-regexp">$field</span> = [
<span class="hljs-string">'id'</span> => <span class="hljs-string">'int'</span>,
<span class="hljs-string">'birthday'</span> => <span class="hljs-string">'int'</span>,
<span class="hljs-string">'status'</span> => <span class="hljs-string">'int'</span>,
<span class="hljs-string">'create_time'</span> => <span class="hljs-string">'int'</span>,
<span class="hljs-string">'update_time'</span> => <span class="hljs-string">'int'</span>,
<span class="hljs-string">'nickname'</span>, <span class="hljs-string">'email'</span>,
];
```
```
`field`属性必须明确设置数据表所有的字段,字符串类型可以不明确定义类型(例如上面的`nickname`和`email`)。
`type`属性用于定义数据的自动转换类型,代表的不一定是数据表的字段类型,目前支持的自动转换类型包括integer、float、boolean、timestamp、datetime、object、array、json和serialize,例如:
```
<pre class="calibre18">
```
<span class="hljs-keyword">protected</span> $<span class="hljs-operator"><span class="hljs-keyword">type</span> =</span> [
<span class="hljs-operator">'birthda</span>y' => <span class="hljs-operator">'timestam</span>p',
];
```
```
`type`属性只需要定义需要系统自动转换的字段。
## 模型的save方法调用后怎么获取自增主键的值?
模型的save方法用于模型对象的保存(包括新增和更新)操作,当新增数据后,返回值不再返回主键,而是统一返回影响的记录数(一般为1或者0),如果需要获取自增主键的值,可以使用下面的方法:
```
<pre class="calibre42">
```
<span class="hljs-regexp">$user</span> = <span class="hljs-keyword">new</span> User;
<span class="hljs-regexp">$user</span>->name = <span class="hljs-string">'thinkphp'</span>;
<span class="hljs-regexp">$user</span>->email = <span class="hljs-string">'thinkphp@qq.com'</span>;
<span class="hljs-keyword">if</span>(<span class="hljs-regexp">$user</span>->save()){
<span class="hljs-comment">// 获取自增主键的值</span><span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->id;
}
```
```
- 脕茫隆垄脨貌脩脭
- 脕茫隆垄脨貌脩脭
- 脪禄隆垄禄霉麓隆
- 脪禄隆垄禄霉麓隆
- 露镁隆垄URL潞脥脗路脫脡
- 露镁隆垄URL潞脥脗路脫脡
- 脠媒隆垄脟毛脟贸潞脥脧矛脫娄
- 脠媒隆垄脟毛脟贸潞脥脧矛脫娄
- 脣脛隆垄脢媒戮脻驴芒
- 脣脛隆垄脢媒戮脻驴芒
- 脦氓隆垄虏茅脩炉脫茂脩脭
- 脦氓隆垄虏茅脩炉脫茂脩脭
- 脕霉隆垄脛拢脨脥潞脥鹿脴脕陋
- 拢篓1拢漏脛拢脨脥露篓脪氓
- 拢篓2拢漏禄霉麓隆虏脵脳梅
- 拢篓3拢漏露脕脠隆脝梅潞脥脨脼赂脛脝梅
- 拢篓4拢漏脌脿脨脥脳陋禄禄潞脥脳脭露炉脥锚鲁脡
- 拢篓5拢漏虏茅脩炉路露脦搂
- 拢篓6拢漏脢盲脠毛潞脥脩茅脰陇
- 拢篓7拢漏鹿脴脕陋
- 拢篓8拢漏脛拢脨脥脢盲鲁枚
- 脝脽隆垄脢脫脥录潞脥脛拢掳氓
- 脝脽隆垄脢脫脥录潞脥脛拢掳氓
- 掳脣隆垄碌梅脢脭潞脥脠脮脰戮
- 掳脣隆垄碌梅脢脭潞脥脠脮脰戮
- 戮脜隆垄API驴陋路垄
- 戮脜隆垄API驴陋路垄
- 脢庐隆垄脙眉脕卯脨脨鹿陇戮脽
- 脢庐隆垄脙眉脕卯脨脨鹿陇戮脽
- 脢庐脪禄隆垄脌漏脮鹿
- 脢庐脪禄隆垄脌漏脮鹿
- 脢庐露镁隆垄脭脫脧卯
- Cookie
- Session
- 碌楼脭陋虏芒脢脭
- 脥录脧帽麓娄脌铆
- 脦脛录镁脡脧麓芦
- 脩茅脰陇脗毛
- 赂陆脗录
- A隆垄鲁拢录没脦脢脤芒录炉
- B隆垄3.2潞脥5.0脟酶卤冒
- C隆垄脰煤脢脰潞炉脢媒
- 路卢脥芒脝陋拢潞脩搂脧掳ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路卢脥芒脝陋拢潞脩搂脧掳ThinkPHP5碌脛脮媒脠路脳脣脢脝