# `ThinkPHP5.0`常見問題集
整理了下ThinkPHP`5.0`的常見問題(不斷更新中~),希望給新手和習慣了`3.2`版本的用戶帶來幫助吧,類似的問題在V5交流群里面一天要問個百八次的 ^\_^
- - [為什么5.0取消了很多常量?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#-5-0-)
- [為啥單字母函數去掉了?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#-)
- [數據庫查詢和模型怎么用?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#--1)
- [關于配置參數的問題](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#u5173u4E8Eu914Du7F6Eu53C2u6570u7684u95EEu9898)
- [怎么才能在控制器中正確的輸出模板](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#u600Eu4E48u624Du80FDu5728u63A7u5236u5668u4E2Du6B63u786Eu7684u8F93u51FAu6A21u677F)
- [沒有創建模型類怎么查詢?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#--2)
- [原來3.2版本的模型的getField方法應該如何使用?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#-3-2-code-getfield-code-)
- [5.0怎么沒有編譯緩存了?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#5-0-)
- [為什么寫入數據的時候不會自動去除數據庫沒有的字段?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#--3)
- [為什么不能識別駝峰法命名的控制器](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#u4E3Au4EC0u4E48u4E0Du80FDu8BC6u522Bu9A7Cu5CF0u6CD5u547Du540Du7684u63A7u5236u5668)
- [5.0的類庫定義可以帶上后綴么?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#-code-5-0-code-)
- [5.0怎么實現模板輸出的特殊字符串替換?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#-code-5-0-code--1)
- [5.0的fetch和display方法有什么區別?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#5-0-fetch-display-)
- [為什么Session無法獲取?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#-session-)
- [為什么無法接收表單數組類型數據?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#--4)
- [為什么模型的查詢返回的都是對象而不是數組](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#u4E3Au4EC0u4E48u6A21u578Bu7684u67E5u8BE2u8FD4u56DEu7684u90FDu662Fu5BF9u8C61u800Cu4E0Du662Fu6570u7EC4)
- [為什么Input類沒有了?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#-code-input-code-)
- [原來的模板標簽怎么不能用了?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#--5)
- [5.0模型的save方法如何過濾非數據表字段值?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#5-0-code-save-code-)
- [為什么路由變量用$\_GET獲取不到?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#-code-e126ed-e95eget-code-)
- [如何關閉未定義變量的錯誤提示?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#--6)
- [如何獲取當前的模塊、控制器和操作名](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#--7)
- [如何讓生成的URL地址帶上index.php](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#-url-index-php)
- [模型類的field屬性和type屬性有什么區別?](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/145260#-code-field-code-code-type-code-)
- [模型的save方法調用后怎么獲取自增主鍵的值?](http://www.hmoore.net/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://www.hmoore.net/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碌脛脮媒脠路脳脣脢脝