<div class="article-body"><!-- react-empty: 189 --><div><h1 data-line="0" class="line"><a id="_0"></a><!-- react-text: 695 -->快速入門(一):基礎<!-- /react-text --></h1><p><!-- react-text: 697 -->本章介紹了<!-- /react-text --><code>ThinkPHP5.0</code><!-- react-text: 699 -->的安裝及基本使用,并給出了一個最簡單的示例帶你了解如何開始開發,主要包含:<!-- /react-text --></p><div class="markdown-toc"><ul><li><a href="#_9">簡介</a></li><li><a href="#_15">安裝</a></li><li><a href="#_112">目錄結構</a></li><li><a href="#_166">運行環境</a></li><li><a href="#_192">入口文件</a></li><li><a href="#_286">資源訪問</a></li><li><a href="#_317">調試模式</a></li><li><a href="#_332">控制器</a></li><li><a href="#_474">視圖</a></li><li><a href="#_532">讀取數據</a></li><li><a href="#_611">總結</a></li></ul></div><blockquote class="danger"><h4><a id="ThinkPHP50httpphpnetmanualzhlanguageoop5phphttpphpnetmanualzhlanguagenamespacesphpPHPPHP50_7"></a><!-- react-text: 727 -->在學習<!-- /react-text --><code>ThinkPHP5.0</code><!-- react-text: 729 -->之前,如果你還不理解<!-- /react-text --><a href="http://php.net/manual/zh/language.oop5.php" target="_blank">面向對象</a><!-- react-text: 731 -->和<!-- /react-text --><a href="http://php.net/manual/zh/language.namespaces.php" target="_blank">命名空間</a><!-- react-text: 733 -->的概念,建議首先去PHP手冊惡補下PHP的相關基礎知識,否則將成為你學習5.0的最大障礙。<!-- /react-text --></h4></blockquote><h2 data-line="9" class="line"><a id="_9"></a><!-- react-text: 736 -->簡介<!-- /react-text --></h2><p><code>ThinkPHP</code><!-- react-text: 225 -->是一個快速、簡單的基于<!-- /react-text --><code>MVC</code><!-- react-text: 227 -->和面向對象的輕量級<!-- /react-text --><code>PHP</code><!-- react-text: 229 -->開發框架,遵循<!-- /react-text --><code>Apache2</code><!-- react-text: 740 -->開源協議發布,自2006年誕生以來一直秉承簡潔實用的設計原則,在保持出色的性能和至簡代碼的同時,尤其注重開發體驗和易用性,并且擁有眾多的原創功能和特性,為<!-- /react-text --><code>WEB</code><!-- react-text: 742 -->應用和<!-- /react-text --><code>API</code><!-- react-text: 744 -->開發提供了強有力的支持。<!-- /react-text --></p><blockquote class="danger"><p><!-- react-text: 232 -->相當于以往版本,<!-- /react-text --><code>ThinkPHP5.0</code><!-- react-text: 234 -->版本是一個顛覆和重構版本,也是<!-- /react-text --><code>ThinkPHP</code><!-- react-text: 236 -->十周年獻禮版本,基于<!-- /react-text --><code>PHP5.4</code><!-- react-text: 746 -->設計(完美支持<!-- /react-text --><code>PHP7</code><!-- react-text: 748 -->),采用全新的架構思想,引入了很多的<!-- /react-text --><code>PHP</code><!-- react-text: 750 -->新特性,優化了核心,減少了依賴,支持<!-- /react-text --><code>Composer</code><!-- react-text: 752 -->,實現了真正的惰性加載,并且為<!-- /react-text --><code>API</code><!-- react-text: 754 -->開發做了深入的支持,在功能、性能以及靈活性方面都較為突出。<!-- /react-text --></p></blockquote><h2 data-line="15" class="line"><a id="_15"></a><!-- react-text: 757 -->安裝<!-- /react-text --></h2><p><!-- react-text: 759 -->ThinkPHP提供多個方式的安裝,包括官網下載、<!-- /react-text --><code>Composer</code><!-- react-text: 761 -->安裝以及<!-- /react-text --><code>GIT</code><!-- react-text: 763 -->下載,對于新手來說,有必要理解這幾種安裝方式的區別。<!-- /react-text --></p><ul><li><strong>官網下載</strong><!-- react-text: 765 -->:一般都是穩定版本(并不會實時更新),有些大的版本還會提供核心版(不含擴展)和完整版(包含常用擴展)兩個版本;<!-- /react-text --></li><li><strong><code>Composer</code><!-- react-text: 768 -->安裝<!-- /react-text --></strong><!-- react-text: 769 -->:是一種主流的安裝方式,<!-- /react-text --><code>Composer</code><!-- react-text: 771 -->也分為穩定版和開發版安裝,如果是安裝的穩定版則可以<!-- /react-text --><code>update</code><!-- react-text: 773 -->到最新的穩定版,如果是安裝的開發版那么<!-- /react-text --><code>update</code><!-- react-text: 775 -->到的也是實時的開發版,安裝慢的可以使用國內鏡像,但注意存在一定的緩存時間;<!-- /react-text --></li><li><strong><code>GIT</code><!-- react-text: 778 -->安裝<!-- /react-text --></strong><!-- react-text: 779 -->:直接通過<!-- /react-text --><code>git</code><!-- react-text: 781 -->地址安裝的方式,優勢是可以實時更新,跟著官方開發版本走的用戶可以選擇<!-- /react-text --><code>GIT</code><!-- react-text: 783 -->更新,也方便及時反饋和提交<!-- /react-text --><code>PR</code><!-- react-text: 785 -->,除了<!-- /react-text --><code>Github</code><!-- react-text: 787 -->之外,國內的碼云和<!-- /react-text --><code>Coding</code><!-- react-text: 789 -->代碼托管平臺都有ThinkPHP5的鏡像,請自行選擇。<!-- /react-text --></li></ul><h3 data-line="22" class="line"><a id="_22"></a><!-- react-text: 792 -->官網下載<!-- /react-text --></h3><p><!-- react-text: 793 -->ThinkPHP最新的穩定版本可以在(<!-- /react-text --><a href="http://thinkphp.cn/down/framework.html" target="_blank">官方網站下載頁</a><!-- react-text: 795 -->)下載,不過官網下載版本并不是實時更新的,我們會在每個版本更新發布的時候重新打包,如果你需要實時更新版本,請使用<!-- /react-text --><code>Git</code><!-- react-text: 797 -->版本庫或者<!-- /react-text --><code>Composer</code><!-- react-text: 799 -->安裝。<!-- /react-text --></p><h3 data-line="26" class="line"><a id="Composer_26"></a><!-- react-text: 802 -->Composer安裝和更新<!-- /react-text --></h3><p><!-- react-text: 316 -->ThinkPHP<!-- /react-text --><code>5.0</code><!-- react-text: 318 -->支持使用<!-- /react-text --><code>Composer</code><!-- react-text: 804 -->安裝和更新,如果還沒有安裝 <!-- /react-text --><code>Composer</code><!-- react-text: 806 -->,你可以按 <!-- /react-text --><a href="http://www.hmoore.net/thinkphp/composer/35669" target="_blank">Composer安裝</a><!-- react-text: 808 --> 中的方法安裝。在 <!-- /react-text --><code>Linux</code><!-- react-text: 810 --> 和 <!-- /react-text --><code>Mac OS X</code><!-- react-text: 812 --> 中可以運行如下命令:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code>curl -sS <span class="hljs-string">https:</span><span class="hljs-comment">//getcomposer.org/installer | php</span>
mv composer.phar <span class="hljs-regexp">/usr/</span>local<span class="hljs-regexp">/bin/</span>composer
</code></pre><p><!-- react-text: 816 -->在 <!-- /react-text --><code>Windows</code><!-- react-text: 818 --> 中,你需要下載并運行 <!-- /react-text --><a href="https://getcomposer.org/Composer-Setup.exe" target="_blank">Composer-Setup.exe</a><!-- react-text: 820 -->。<!-- /react-text --></p><blockquote class="success"><h3><a id="_37"></a><!-- react-text: 823 -->提示:<!-- /react-text --></h3><hr><p><!-- react-text: 826 -->如果遇到任何問題或者想更深入地學習 Composer,請參考 <!-- /react-text --><a href="https://getcomposer.org/doc/" target="_blank">Composer 官方文檔(英文)</a><!-- react-text: 828 -->,看云上有 <!-- /react-text --><a href="http://www.hmoore.net/thinkphp/composer" target="_blank">Composer 的中文版本</a><!-- react-text: 830 -->。<!-- /react-text --></p></blockquote><p><!-- react-text: 832 -->如果你已經安裝有 <!-- /react-text --><code>Composer</code><!-- react-text: 834 --> 請確保使用的是最新版本,或者可以用 <!-- /react-text --><code>composer self-update</code><!-- react-text: 836 --> 命令更新為最新版本。<!-- /react-text --></p><p>由于眾所周知的原因,國外的網站連接速度很慢,并且隨時可能被“墻”甚至“不存在”。因此安裝的時間可能會比較長,我們建議通過下面的方式使用國內鏡像。</p><blockquote class="info"><p>打開命令行窗口(windows用戶)或控制臺(Linux、Mac 用戶)并執行如下命令:</p></blockquote><pre style="border: 1px solid silver;"><code>composer config -g repo<span class="hljs-selector-class">.packagist</span> composer https:<span class="hljs-comment">//packagist.phpcomposer.com</span>
</code></pre><p>然后在命令行下面,切換到你的web根目錄下面并執行下面的命令:</p><pre style="border: 1px solid silver;"><code><span class="hljs-string">composer </span><span class="hljs-built_in">create-project</span> <span class="hljs-string">topthink/</span><span class="hljs-string">think </span><span class="hljs-string">tp5 </span> <span class="hljs-built_in">--prefer-dist</span>
</code></pre><p><!-- react-text: 846 -->如果出現錯誤提示,請根據提示操作或者參考<!-- /react-text --><a href="http://www.hmoore.net/thinkphp/composer" target="_blank">Composer中文文檔</a><!-- react-text: 848 -->。<!-- /react-text --></p><p><!-- react-text: 850 -->如果之前使用<!-- /react-text --><code>Composer</code><!-- react-text: 852 -->安裝的話,首先切換到你的<!-- /react-text --><code>tp5</code><!-- react-text: 854 -->目錄,然后使用下面的命令更新框架到最新版本(注意因為緩存關系,<!-- /react-text --><code>composer</code><!-- react-text: 856 -->不一定是及時更新的):<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="hljs-attribute">composer update</span>
</code></pre><blockquote class="danger"><h3><a id="_62"></a><!-- react-text: 862 -->注意:<!-- /react-text --></h3><hr><p>使用composer update更新核心框架會清空原來的核心框架目錄,如果你定制了核心框架或者添加了擴展在核心目錄的話,建議使用后面的Git方式更新。</p></blockquote><h3 data-line="66" class="line"><a id="Git_66"></a><!-- react-text: 867 -->Git下載和更新<!-- /react-text --></h3><p><code>ThinkPHP</code><!-- react-text: 870 -->使用<!-- /react-text --><code>Git</code><!-- react-text: 872 -->版本庫進行更新迭代,如果你不太了解<!-- /react-text --><code>Composer</code><!-- react-text: 874 -->或者覺得<!-- /react-text --><code>Composer</code><!-- react-text: 876 -->太慢,也可以使用<!-- /react-text --><code>git</code><!-- react-text: 878 -->版本庫安裝和更新,<!-- /react-text --><code>ThinkPHP5.0</code><!-- react-text: 880 -->拆分為多個倉庫,下面是<!-- /react-text --><code>github</code><!-- react-text: 882 -->(主要維護倉庫)及國內的倉庫地址:<!-- /react-text --></p><h4 data-line="70" class="line"><a id="_Github__70"></a><!-- react-text: 885 -->[ Github ]<!-- /react-text --></h4><ul><li><!-- react-text: 888 -->應用項目:<!-- /react-text --><code>https://github.com/top-think/think</code></li><li><!-- react-text: 891 -->核心框架:<!-- /react-text --><code>https://github.com/top-think/framework</code></li></ul><h4 data-line="75" class="line"><a id="___75"></a><!-- react-text: 895 -->[ 碼云 ]<!-- /react-text --></h4><ul><li><!-- react-text: 898 -->應用項目:<!-- /react-text --><code>https://git.oschina.net/liu21st/thinkphp5.git</code></li><li><!-- react-text: 901 -->核心框架:<!-- /react-text --><code>https://git.oschina.net/liu21st/framework.git</code></li></ul><h4 data-line="80" class="line"><a id="_Coding__80"></a><!-- react-text: 905 -->[ Coding ]<!-- /react-text --></h4><ul><li><!-- react-text: 908 -->應用項目:<!-- /react-text --><code>https://git.coding.net/liu21st/thinkphp5.git</code></li><li><!-- react-text: 911 -->核心框架:<!-- /react-text --><code>https://git.coding.net/liu21st/framework.git</code></li></ul><blockquote class="success"><h3><a id="_85"></a><!-- react-text: 916 -->提示:<!-- /react-text --></h3><hr><p><!-- react-text: 919 -->[info] 之所以設計為應用和核心倉庫分離,是為了支持<!-- /react-text --><code>Composer</code><!-- react-text: 921 -->單獨更新核心框架。<!-- /react-text --></p></blockquote><p><!-- react-text: 923 -->如果你還沒安裝<!-- /react-text --><code>Git</code><!-- react-text: 925 -->,可以參考閱讀 <!-- /react-text --><a href="http://www.hmoore.net/kancloud/progit" target="_blank">Pro Git第二版(中文)</a><!-- react-text: 927 -->先。<!-- /react-text --></p><p>首先克隆下載應用項目倉庫</p><pre style="border: 1px solid silver;"><code>git <span class="hljs-keyword">clone</span> <span class="hljs-title">https</span>://github.com/top-think/think tp5
</code></pre><p><!-- react-text: 932 -->然后切換到<!-- /react-text --><code>tp5</code><!-- react-text: 934 -->目錄下面,再克隆核心框架倉庫:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code>git <span class="hljs-keyword">clone</span> <span class="hljs-title">https</span>://github.com/top-think/framework thinkphp
</code></pre><p><!-- react-text: 938 -->兩個倉庫克隆完成后,就完成了<!-- /react-text --><code>ThinkPHP5.0</code><!-- react-text: 940 -->的<!-- /react-text --><code>Git</code><!-- react-text: 942 -->方式下載,如果需要更新核心框架的時候,只需要切換到thinkphp核心目錄下面,然后執行:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code>git pull https:<span class="hljs-regexp">//gi</span>thub.com<span class="hljs-regexp">/top-think/</span>framework
</code></pre><p><!-- react-text: 946 -->如果不熟悉<!-- /react-text --><code>git</code><!-- react-text: 948 -->命令行,可以使用任何一個<!-- /react-text --><code>GIT</code><!-- react-text: 950 -->客戶端進行操作,在此不再詳細說明。<!-- /react-text --></p><blockquote class="default"><p><!-- react-text: 953 -->Github上還給新手提供了包含了常用擴展的完整版,可以免去composer安裝的煩惱,下載地址:<!-- /react-text --><a href="https://github.com/top-think/think/tree/archive">https://github.com/top-think/think/tree/archive</a></p></blockquote><p><!-- react-text: 956 -->GIT方式只能安裝核心框架,官方擴展只能通過<!-- /react-text --><code>Composer</code><!-- react-text: 958 -->安裝。<!-- /react-text --></p><h2 data-line="112" class="line"><a id="_112"></a><!-- react-text: 961 -->目錄結構<!-- /react-text --></h2><p><code>Composer</code><br><!-- react-text: 965 -->
安裝后(或者下載后的壓縮文件解壓后)可以看到下面的目錄結構:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code>tp5
├─application 應用目錄
├─extend 擴展類庫目錄(可定義)
├─public 網站對外訪問目錄
├─runtime 運行時目錄(可定義)
├─vendor 第三方類庫目錄(Composer)
├─thinkphp 框架核心目錄
├─build<span class="hljs-selector-class">.php</span> 自動生成定義文件(參考)
├─composer<span class="hljs-selector-class">.json</span> Composer定義文件
├─LICENSE<span class="hljs-selector-class">.txt</span> 授權說明文件
├─README<span class="hljs-selector-class">.md</span> README 文件
├─think 命令行工具入口
</code></pre><blockquote class="danger"><h3><a id="_131"></a><!-- react-text: 971 -->注意:<!-- /react-text --></h3><hr><p><!-- react-text: 974 -->如果在linux環境下面的話,需要給<!-- /react-text --><code>runtime</code><!-- react-text: 976 -->目錄<!-- /react-text --><code>755</code><!-- react-text: 978 -->權限。<!-- /react-text --></p></blockquote><p>有幾個關鍵的路徑先了解下:</p><table><thead><tr><th>目錄</th><th>說明</th><th>常量</th></tr></thead><tbody><tr><td>tp5</td><td>項目根目錄</td><td>ROOT_PATH</td></tr><tr><td>tp5/application</td><td>應用目錄</td><td>APP_PATH</td></tr><tr><td>tp5/thinkphp</td><td>框架核心目錄</td><td>THINK_PATH</td></tr><tr><td>tp5/extend</td><td>應用擴展目錄</td><td>EXTEND_PATH</td></tr><tr><td>tp5/vendor</td><td>Composer擴展目錄</td><td>VENDOR_PATH</td></tr></tbody></table><p>核心框架目錄的結構如下:</p><pre style="border: 1px solid silver;"><code>├─thinkphp 框架系統目錄
│ ├─lang 語言包目錄
│ ├─library 框架核心類庫目錄
│ │ ├─think think 類庫包目錄
│ │ └─traits 系統 traits 目錄
│ ├─tpl 系統模板目錄
│ │
│ ├─<span class="hljs-selector-class">.htaccess</span> 用于 apache 的重寫
│ ├─<span class="hljs-selector-class">.travis</span><span class="hljs-selector-class">.yml</span> CI 定義文件
│ ├─base<span class="hljs-selector-class">.php</span> 框架基礎文件
│ ├─composer<span class="hljs-selector-class">.json</span> composer 定義文件
│ ├─console<span class="hljs-selector-class">.php</span> 控制臺入口文件
│ ├─convention<span class="hljs-selector-class">.php</span> 慣例配置文件
│ ├─helper<span class="hljs-selector-class">.php</span> 助手函數文件(可選)
│ ├─LICENSE<span class="hljs-selector-class">.txt</span> 授權說明文件
│ ├─phpunit<span class="hljs-selector-class">.xml</span> 單元測試配置文件
│ ├─README<span class="hljs-selector-class">.md</span> README 文件
│ └─start<span class="hljs-selector-class">.php</span> 框架引導文件
</code></pre><h2 data-line="166" class="line"><a id="_166"></a><!-- react-text: 1012 -->運行環境<!-- /react-text --></h2><blockquote class="info"><p>ThinkPHP5的環境要求如下:</p><ul><li>PHP >= 5.4.0 (完美支持PHP7)</li><li>PDO PHP Extension</li><li>MBstring PHP Extension</li><li>CURL PHP Extension</li></ul></blockquote><p><!-- react-text: 1021 -->在開始之前,你需要一個<!-- /react-text --><code>Web</code><!-- react-text: 1023 -->服務器和**<!-- /react-text --><code>PHP5.4+</code><!-- react-text: 1025 -->**運行環境,如果你暫時還沒有,我們推薦使用集成開發環境<!-- /react-text --><a href="http://www.wampserver.com/en/" target="_blank">WAMPServer</a><!-- react-text: 1027 -->(Windows系統下集成Apache、PHP和MySQL的服務套件)來使用<!-- /react-text --><code>ThinkPHP</code><!-- react-text: 1029 -->進行本地開發和測試,最新版本的WAMP在<!-- /react-text --><a href="https://sourceforge.net/projects/wampserver/files/WampServer%203/" target="_blank">這里下載</a><!-- react-text: 1031 -->。<!-- /react-text --></p><p><!-- react-text: 1033 -->如果你不想安裝任何<!-- /react-text --><code>WEB</code><!-- react-text: 1035 -->服務器,也可以直接使用PHP自帶的<!-- /react-text --><code>WebServer</code><!-- react-text: 1037 -->,并且運行<!-- /react-text --><code>router.php</code><!-- react-text: 1039 -->來運行測試。<!-- /react-text --></p><p><!-- react-text: 1041 -->我們進入命令行,進入<!-- /react-text --><code>tp5/public</code><!-- react-text: 1043 -->目錄后,輸入如下命令:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="hljs-selector-tag">php</span> <span class="hljs-selector-tag">-S</span> <span class="hljs-selector-tag">localhost</span><span class="hljs-selector-pseudo">:8888</span> <span class="hljs-selector-tag">router</span><span class="hljs-selector-class">.php</span>
</code></pre><blockquote class="danger"><p><!-- react-text: 1048 -->如果提示錯誤,請檢查你的<!-- /react-text --><code>php.exe</code><!-- react-text: 1050 -->所在路徑是否已經加入系統環境變量<!-- /react-text --><code>Path</code><!-- react-text: 1052 -->。<!-- /react-text --></p></blockquote><p>接下來可以直接訪問</p><pre style="border: 1px solid silver;"><code><span class="hljs-symbol">http:</span><span class="hljs-comment">//localhost:8888</span>
</code></pre><blockquote class="default"><p><!-- react-text: 1058 -->注意: S 一定要大寫,端口號可以隨意設置,只要和已有的不沖突,如果要停止服務,直接在命令行下面按<!-- /react-text --><code>CTRL+C</code><!-- react-text: 1060 --> 即可退出。<!-- /react-text --></p></blockquote><h2 data-line="192" class="line"><a id="_192"></a><!-- react-text: 1063 -->入口文件<!-- /react-text --></h2><p><code>ThinkPHP5.0</code><!-- react-text: 1066 -->版本的默認自帶的入口文件位于<!-- /react-text --><code>public/index.php</code><!-- react-text: 1068 -->(實際部署的時候<!-- /react-text --><code>public</code><!-- react-text: 1070 -->目錄為你的應用對外訪問目錄),入口文件內容如下:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="hljs-comment">// 定義應用目錄</span>
<span class="hljs-class"><span class="hljs-keyword">define</span></span>(<span class="hljs-string">'APP_PATH'</span>, __DIR__ . <span class="hljs-string">'/../application/'</span>);
<span class="hljs-comment">// 加載框架引導文件</span>
<span class="hljs-keyword">require</span> __DIR__ . <span class="hljs-string">'/../thinkphp/start.php'</span>;
</code></pre><p><!-- react-text: 1074 -->這段代碼的作用就是定義應用目錄<!-- /react-text --><code>APP_PATH</code><!-- react-text: 1076 -->和加載<!-- /react-text --><code>ThinkPHP</code><!-- react-text: 1078 -->框架的入口文件,這是所有基于<!-- /react-text --><code>ThinkPHP</code><!-- react-text: 1080 -->開發應用的第一步。<!-- /react-text --></p><p>我們可以在瀏覽器中訪問入口文件</p><pre style="border: 1px solid silver;"><code><span class="hljs-symbol">http:</span><span class="hljs-comment">//localhost/tp5/public/</span>
</code></pre><p>運行后我們會看到歡迎頁面:</p><p><img src="https://box.kancloud.cn/2016-03-11_56e274a2376df.png" alt=""></p><p>官方提供的默認應用的實際目錄結構和說明如下:</p><pre style="border: 1px solid silver;"><code>├─application 應用目錄(可設置)
│ ├─index 模塊目錄(可更改)
│ │ ├─config<span class="hljs-selector-class">.php</span> 模塊配置文件
│ │ ├─common<span class="hljs-selector-class">.php</span> 模塊公共文件
│ │ ├─controller 控制器目錄
│ │ ├─model 模型目錄
│ │ └─view 視圖目錄
│ │
│ ├─command<span class="hljs-selector-class">.php</span> 命令行工具配置文件
│ ├─common<span class="hljs-selector-class">.php</span> 應用公共文件
│ ├─config<span class="hljs-selector-class">.php</span> 應用配置文件
│ ├─tags<span class="hljs-selector-class">.php</span> 應用行為擴展定義文件
│ ├─database<span class="hljs-selector-class">.php</span> 數據庫配置文件
│ └─route<span class="hljs-selector-class">.php</span> 路由配置文件
</code></pre><p><code>5.0</code><!-- react-text: 1092 -->版本采用模塊化的設計架構,默認的應用目錄下面只有一個<!-- /react-text --><code>index</code><!-- react-text: 1094 -->模塊目錄,如果我要添加新的模塊可以使用控制臺命令來生成。<!-- /react-text --></p><p>切換到命令行模式下,進入到應用根目錄并執行如下指令:</p><pre style="border: 1px solid silver;"><code>php think build --<span class="hljs-class"><span class="hljs-keyword">module</span> <span class="hljs-title">demo</span></span>
</code></pre><p>就會生成一個默認的demo模塊,包括如下目錄結構:</p><pre style="border: 1px solid silver;"><code>├─demo
│ ├─controller 控制器目錄
│ ├─model 模型目錄
│ ├─view 視圖目錄
│ ├─config<span class="hljs-selector-class">.php</span> 模塊配置文件
│ └─common<span class="hljs-selector-class">.php</span> 模塊公共文件
</code></pre><p><!-- react-text: 1102 -->同時也會生成一個默認的<!-- /react-text --><code>Index</code><!-- react-text: 1104 -->控制器文件。<!-- /react-text --></p><blockquote class="default"><p>注意:這只是一個初始默認的目錄結構,在實際的開發過程中可能需要創建更多的目錄和文件。</p></blockquote><p><!-- react-text: 1108 -->在后面的示例中,為了方便訪問,我們設置<!-- /react-text --><code>vhost</code><!-- react-text: 1110 -->訪問,以<!-- /react-text --><code>apache</code><!-- react-text: 1112 -->為例的話定義如下:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="hljs-section"><VirtualHost *:80></span>
<span class="hljs-attribute"><span class="hljs-nomarkup">DocumentRoot</span></span> <span class="hljs-string">"/home/www/tp5/public"</span>
<span class="hljs-attribute"><span class="hljs-nomarkup">ServerName</span></span> tp5.com
<span class="hljs-section"></VirtualHost></span>
</code></pre><blockquote class="default"><p><!-- react-text: 1117 -->把<!-- /react-text --><code>DocumentRoot</code><!-- react-text: 1119 -->修改為你本機<!-- /react-text --><code>tp5/public</code><!-- react-text: 1121 -->所在目錄,并注意修改本機的<!-- /react-text --><code>hosts</code><!-- react-text: 1123 -->文件把<!-- /react-text --><code>tp5.com</code><!-- react-text: 1125 -->指向本地<!-- /react-text --><code>127.0.0.1</code><!-- react-text: 1127 -->。<!-- /react-text --></p></blockquote><p><!-- react-text: 1129 -->如果你暫時不想設置<!-- /react-text --><code>vhost</code><!-- react-text: 1131 -->或者還不是特別了解如何設置,可以先把入口文件移動到框架的<!-- /react-text --><code>ROOT_PATH</code><!-- react-text: 1133 -->目錄,并更改入口文件中的<!-- /react-text --><code>APP_PATH</code><!-- react-text: 1135 -->和框架入口文件的位置(這里順便展示下如何更改相關目錄名稱),<!-- /react-text --><code>index.php</code><!-- react-text: 1137 -->文件內容如下:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="hljs-comment">// 定義應用目錄為apps</span>
<span class="hljs-class"><span class="hljs-keyword">define</span></span>(<span class="hljs-string">'APP_PATH'</span>, __DIR__ . <span class="hljs-string">'/apps/'</span>);
<span class="hljs-comment">// 加載框架引導文件</span>
<span class="hljs-keyword">require</span> __DIR__ . <span class="hljs-string">'/think/start.php'</span>;
</code></pre><p>這樣最終的應用目錄結構如下:</p><pre style="border: 1px solid silver;"><code>tp5
├─<span class="hljs-keyword">index</span>.php 應用入口文件
├─apps 應用目錄
├─<span class="hljs-keyword">public</span> 資源文件目錄
├─runtime 運行時目錄
└─think 框架目錄
</code></pre><p>實際的訪問URL變成了</p><pre style="border: 1px solid silver;"><code>http:<span class="hljs-regexp">//</span>localhost<span class="hljs-regexp">/tp5/</span>
</code></pre><blockquote class="success"><h3><a id="_282"></a><!-- react-text: 1149 -->提示:<!-- /react-text --></h3><hr><p><!-- react-text: 1152 -->如非特別說明,我們后面的示例均以<!-- /react-text --><code>tp5.com</code><!-- react-text: 1154 -->進行訪問,如果你使用了其它的方式請自行修改。<!-- /react-text --></p></blockquote><h2 data-line="286" class="line"><a id="_286"></a><!-- react-text: 1157 -->資源訪問<!-- /react-text --></h2><p>網站的資源文件訪問不會影響正常的操作訪問,只有當訪問的資源文件不存在的時候才會解析到入口文件,一般就會提示模塊不存在的錯誤。</p><p><!-- react-text: 1160 -->網站的資源文件一般放入<!-- /react-text --><code>public</code><!-- react-text: 1162 -->目錄的子目錄下面,例如下面是一個建議規范:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code>public
├─index<span class="hljs-selector-class">.php</span> 應用入口文件
├─static 靜態資源目錄
│ ├─css 樣式目錄
│ ├─js 腳本目錄
│ └─<span class="hljs-selector-tag">img</span> 圖像目錄
</code></pre><blockquote class="danger"><p><!-- react-text: 1167 -->記住,千萬不要在<!-- /react-text --><code>public</code><!-- react-text: 1169 -->目錄之外的任何位置放置資源文件,包括<!-- /react-text --><code>application</code><!-- react-text: 1171 -->目錄。<!-- /react-text --></p></blockquote><p>訪問資源文件的URL路徑是:</p><pre style="border: 1px solid silver;"><code><span class="hljs-symbol">http:</span>/<span class="hljs-regexp">/tp5.com/static</span><span class="hljs-regexp">/css/style</span>.css
<span class="hljs-symbol">http:</span>/<span class="hljs-regexp">/tp5.com/static</span><span class="hljs-regexp">/js/common</span>.js
<span class="hljs-symbol">http:</span>/<span class="hljs-regexp">/tp5.com/static</span><span class="hljs-regexp">/img/picture</span>.jpg
</code></pre><p>如果你沒有設置域名綁定,而是使用子目錄方式訪問的話,那么可能的資源訪問地址是:</p><pre style="border: 1px solid silver;"><code>http:<span class="hljs-regexp">//</span>localhost<span class="hljs-regexp">/public/</span>static<span class="hljs-regexp">/css/</span>style.css
http:<span class="hljs-regexp">//</span>localhost<span class="hljs-regexp">/public/</span>static<span class="hljs-regexp">/js/</span>common.js
http:<span class="hljs-regexp">//</span>localhost<span class="hljs-regexp">/public/</span>static<span class="hljs-regexp">/img/</span>picture.jpg
</code></pre><blockquote class="default"><p><!-- react-text: 1180 -->網站的入口文件就是資源文件的起始位置,如果你的入口文件不是在<!-- /react-text --><code>public</code><!-- react-text: 1182 -->目錄下面的話,還需要自行調整。<!-- /react-text --><br><!-- react-text: 1184 -->
如果不清楚當前的入口文件位置,可以使用<!-- /react-text --><code>phpinfo()</code><!-- react-text: 1186 -->在頁面輸出中查看<!-- /react-text --><code>DOCUMENT_ROOT</code><!-- react-text: 1188 -->的值。<!-- /react-text --></p></blockquote><h2 data-line="317" class="line"><a id="_317"></a><!-- react-text: 1191 -->調試模式<!-- /react-text --></h2><p><code>ThinkPHP</code><!-- react-text: 1194 -->支持調試模式,默認情況下是開啟狀態。調試模式以除錯方便優先,而且在異常的時候可以顯示盡可能多的信息,所以對性能有一定的影響。<!-- /react-text --></p><p><!-- react-text: 1196 -->我們強烈建議開發者在使用<!-- /react-text --><code>ThinkPHP</code><!-- react-text: 1198 -->開發的過程中使用調試模式,<!-- /react-text --><code>5.0</code><!-- react-text: 1200 -->默認情況下可以捕獲到任何細微的錯誤并拋出異常,這樣可以更好的獲取錯誤提示和避免一些問題和隱患,<!-- /react-text --><strong>不要畏懼錯誤,要勇敢面對,并消除隱患</strong><!-- react-text: 1202 -->。<!-- /react-text --></p><p><!-- react-text: 1204 -->開發完成后,我們實際進行項目部署的時候,修改應用配置文件(<!-- /react-text --><code>application/config.php</code><!-- react-text: 1206 -->)中的<!-- /react-text --><code>app_debug</code><!-- react-text: 1208 -->配置參數:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="hljs-comment">// 關閉調試模式</span>
<span class="hljs-string">'app_debug'</span> => <span class="hljs-keyword">false</span>,
</code></pre><blockquote class="default"><p>為了安全考慮,避免泄露你的服務器WEB目錄信息等資料,一定記得正式部署的時候關閉調試模式。</p></blockquote><h2 data-line="332" class="line"><a id="_332"></a><!-- react-text: 1215 -->控制器<!-- /react-text --></h2><p><!-- react-text: 1217 -->我們找到<!-- /react-text --><code>index</code><!-- react-text: 1219 -->模塊的<!-- /react-text --><code>Index</code><!-- react-text: 1221 -->控制器(文件位于<!-- /react-text --><code>application/index/controller/Index.php</code><!-- react-text: 1223 --> 注意大小寫),我們把<!-- /react-text --><code>Index</code><!-- react-text: 1225 -->控制器類的<!-- /react-text --><code>index</code><!-- react-text: 1227 -->方法修改為<!-- /react-text --><code>Hello,World!</code><!-- react-text: 1229 -->。<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="php"><span class="hljs-meta"><?php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span>
</span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-params">()</span>
</span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,World!'</span>;
}
}
</span></code></pre><blockquote class="success"><h3><a id="_348"></a><!-- react-text: 1235 -->提示:<!-- /react-text --></h3><hr><p><!-- react-text: 1238 -->根據類的命名空間可以快速定位文件位置,在<!-- /react-text --><code>ThinkPHP5.0</code><!-- react-text: 1240 -->的規范里面,命名空間其實對應了文件的所在目錄,<!-- /react-text --><code>app</code><!-- react-text: 1242 -->命名空間通常代表了文件的起始目錄為<!-- /react-text --><code>application</code><!-- react-text: 1244 -->,而<!-- /react-text --><code>think</code><!-- react-text: 1246 -->命名空間則代表了文件的起始目錄為<!-- /react-text --><code>thinkphp/library/think</code><!-- react-text: 1248 -->,后面的命名空間則表示從起始目錄開始的子目錄。<!-- /react-text --></p></blockquote><p>我們訪問URL地址</p><pre style="border: 1px solid silver;"><code><span class="hljs-symbol">http:</span><span class="hljs-comment">//tp5.com</span>
</code></pre><p><!-- react-text: 1253 -->就會看到<!-- /react-text --><code>Hello,World!</code><!-- react-text: 1255 -->的輸出結果。<!-- /react-text --></p><p><!-- react-text: 1257 -->如果要訪問一個駝峰命名的控制器,例如我們把上面的例子改成一個<!-- /react-text --><code>HelloWorld</code><!-- react-text: 1259 -->控制器。<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="php"><span class="hljs-meta"><?php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HelloWorld</span>
</span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-params">($name = <span class="hljs-string">'World'</span>)</span>
</span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,'</span> . $name . <span class="hljs-string">'!'</span>;
}
}
</span></code></pre><p>默認情況下正確的方法是使用下面的URL進行訪問</p><pre style="border: 1px solid silver;"><code>http://tp5.<span class="hljs-keyword">com</span>/<span class="hljs-built_in">index</span>.php/<span class="hljs-built_in">index</span>/hello_world
</code></pre><p>下面的訪問地址是錯誤的</p><pre style="border: 1px solid silver;"><code>http://tp5.<span class="hljs-keyword">com</span>/<span class="hljs-built_in">index</span>.php/<span class="hljs-built_in">index</span>/HelloWorld
</code></pre><p><img src="https://box.kancloud.cn/53358a74210f3ad08afcc0c7d53b03d8_766x485.png" alt=""></p><p>因為默認的URL訪問是不區分大小寫的,全部都會轉換為小寫的控制器名,除非你在應用配置文件中,設置了關閉url自動轉換如下:</p><pre style="border: 1px solid silver;"><code><span class="hljs-string">'url_convert'</span> => <span class="hljs-keyword">false</span>,
</code></pre><p>那么就可以正常訪問</p><pre style="border: 1px solid silver;"><code>http://tp5.<span class="hljs-keyword">com</span>/<span class="hljs-built_in">index</span>.php/<span class="hljs-built_in">index</span>/HelloWorld
</code></pre><p>如果要繼承一個公共的控制器類,可以使用:</p><pre style="border: 1px solid silver;"><code><span class="php"><span class="hljs-meta"><?php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>\<span class="hljs-title">Base</span>;
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Base</span>
</span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-params">()</span>
</span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,World!'</span>;
}
}
</span></code></pre><p>可以為操作方法定義參數,例如:</p><pre style="border: 1px solid silver;"><code><span class="php"><span class="hljs-meta"><?php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span>
</span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-params">($name = <span class="hljs-string">'World'</span>)</span>
</span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,'</span> . $name . <span class="hljs-string">'!'</span>;
}
}
</span></code></pre><p><!-- react-text: 1283 -->當我們帶<!-- /react-text --><code>name</code><!-- react-text: 1285 -->參數訪問入口文件地址(例如 <!-- /react-text --><code>http://tp5.com?name=ThinkPHP</code><!-- react-text: 1287 -->)的時候,在瀏覽器中可以看到如下輸出:<!-- /react-text --></p><p><code>Hello,ThinkPHP!</code></p><p><!-- react-text: 1291 -->控制器類可以包括多個操作方法,但如果你的操作方法是<!-- /react-text --><code>protected</code><!-- react-text: 1293 -->或者<!-- /react-text --><code>private</code><!-- react-text: 1295 -->類型的話,是無法直接通過URL訪問到該操作的,也就是說只有<!-- /react-text --><code>public</code><!-- react-text: 1297 -->類型的操作方法才是可以通過URL訪問的。<!-- /react-text --></p><p><!-- react-text: 1299 -->我們來驗證下,把<!-- /react-text --><code>Index</code><!-- react-text: 1301 -->控制器類的方法修改為:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="php"><span class="hljs-meta"><?php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span>
</span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-params">()</span>
</span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'hello,thinkphp!'</span>;
}
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test</span><span class="hljs-params">()</span>
</span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'這是一個測試方法!'</span>;
}
<span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello2</span><span class="hljs-params">()</span>
</span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'只是protected方法!'</span>;
}
<span class="hljs-keyword">private</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello3</span><span class="hljs-params">()</span>
</span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'這是private方法!'</span>;
}
}
</span></code></pre><p>當我們訪問如下URL地址的時候,前面兩個是正常訪問,后面兩個則會顯示異常。</p><pre style="border: 1px solid silver;"><code>http://tp5.<span class="hljs-keyword">com</span>/<span class="hljs-built_in">index</span>.php/<span class="hljs-built_in">index</span>/<span class="hljs-built_in">index</span>/hello
http://tp5.<span class="hljs-keyword">com</span>/<span class="hljs-built_in">index</span>.php/<span class="hljs-built_in">index</span>/<span class="hljs-built_in">index</span>/test
http://tp5.<span class="hljs-keyword">com</span>/<span class="hljs-built_in">index</span>.php/<span class="hljs-built_in">index</span>/<span class="hljs-built_in">index</span>/hello2
http://tp5.<span class="hljs-keyword">com</span>/<span class="hljs-built_in">index</span>.php/<span class="hljs-built_in">index</span>/<span class="hljs-built_in">index</span>/hello3
</code></pre><p><!-- react-text: 1308 -->當我們訪問<!-- /react-text --><code>hello2</code><!-- react-text: 1310 -->和<!-- /react-text --><code>hello3</code><!-- react-text: 1312 -->操作方法后的結果都會顯示類似的異常信息:<!-- /react-text --><br><img src="https://box.kancloud.cn/bbb4dd03b8b6a95ddd4129cd56db00ca_1162x716.png" alt=""></p><p>異常頁面包含了詳細的錯誤信息,是因為開啟了調試模式,如果關閉調試模式的話,看到的默認信息如下:</p><p><img src="https://box.kancloud.cn/ceb999e12c1f654c259699b02f3649b0_852x175.png" alt=""></p><h2 data-line="474" class="line"><a id="_474"></a><!-- react-text: 1320 -->視圖<!-- /react-text --></h2><p><!-- react-text: 1322 -->現在我們在給控制器添加視圖文件功能,我們在<!-- /react-text --><code>application/index</code><!-- react-text: 1324 -->目錄下面創建一個<!-- /react-text --><code>view</code><!-- react-text: 1326 -->目錄,然后添加模板文件<!-- /react-text --><code>view/index/hello.html</code><!-- react-text: 1328 -->(注意大小寫),我們添加模板內容如下:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="xml"><span class="hljs-tag"><<span class="hljs-name">html</span>></span>
<span class="hljs-tag"><<span class="hljs-name">head</span>></span>
<span class="hljs-tag"><<span class="hljs-name">title</span>></span>hello </span><span class="hljs-template-variable">{$name}</span><span class="xml"><span class="hljs-tag"></<span class="hljs-name">title</span>></span>
<span class="hljs-tag"></<span class="hljs-name">head</span>></span>
<span class="hljs-tag"><<span class="hljs-name">body</span>></span>
hello, </span><span class="hljs-template-variable">{$name}</span><span class="xml">!
<span class="hljs-tag"></<span class="hljs-name">body</span>></span>
<span class="hljs-tag"></<span class="hljs-name">html</span>></span>
</span></code></pre><p>要輸出視圖,必須在控制器方法中進行模板渲染輸出操作,現在修改控制器類如下:</p><pre style="border: 1px solid silver;"><code><span class="php"><span class="hljs-meta"><?php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Controller</span>;
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span>
</span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-params">($name = <span class="hljs-string">'thinkphp'</span>)</span>
</span>{
<span class="hljs-keyword">$this</span>->assign(<span class="hljs-string">'name'</span>, $name);
<span class="hljs-keyword">return</span> <span class="hljs-keyword">$this</span>->fetch();
}
}
</span></code></pre><blockquote class="danger"><h3><a id="___505"></a><!-- react-text: 1337 -->[ 新手須知 ]<!-- /react-text --></h3><hr><p><!-- react-text: 1340 -->這里使用了<!-- /react-text --><code>use</code><!-- react-text: 1342 -->來導入一個命名空間的類庫,然后可以在當前文件中直接使用該別名而不需要使用完整的命名空間路徑訪問類庫。也就說,如果沒有使用<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Controller</span>;
</code></pre><p>就必須使用</p><pre style="border: 1px solid silver;"><code><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">\think\Controller</span></span>
</code></pre><p>這種完整命名空間方式。</p><p><!-- react-text: 1350 -->在后面的內容中,如果我們直接調用系統的某個類的話,都會假設已經在類的開頭使用<!-- /react-text --><code>use</code><!-- react-text: 1352 -->進行了別名導入。<!-- /react-text --></p></blockquote><p><!-- react-text: 1354 -->注意,<!-- /react-text --><code>Index</code><!-- react-text: 1356 -->控制器類繼承了 <!-- /react-text --><code>think\Controller</code><!-- react-text: 1358 -->類之后,我們可以直接使用封裝好的<!-- /react-text --><code>assign</code><!-- react-text: 1360 -->和<!-- /react-text --><code>fetch</code><!-- react-text: 1362 -->方法進行模板變量賦值和渲染輸出。<!-- /react-text --></p><p><code>fetch</code><!-- react-text: 1365 -->方法中我們沒有指定任何模板,所以按照系統默認的規則(<!-- /react-text --><strong>視圖目錄/控制器/操作方法</strong><!-- react-text: 1367 -->)輸出了<!-- /react-text --><code>view/index/hello.html</code><!-- react-text: 1369 -->模板文件。<!-- /react-text --></p><p>接下來,我們在瀏覽器訪問</p><pre style="border: 1px solid silver;"><code>http://tp5.<span class="hljs-keyword">com</span>/<span class="hljs-built_in">index</span>.php/<span class="hljs-built_in">index</span>/<span class="hljs-built_in">index</span>/hello
</code></pre><p>輸出:</p><p><code>hello,thinkphp!</code></p><h2 data-line="532" class="line"><a id="_532"></a><!-- react-text: 1378 -->讀取數據<!-- /react-text --></h2><p><!-- react-text: 1380 -->在開始之前,我們首先在數據庫<!-- /react-text --><code>demo</code><!-- react-text: 1382 -->中創建一個<!-- /react-text --><code>think_data</code><!-- react-text: 1384 -->數據表(這里以<!-- /react-text --><code>mysql</code><!-- react-text: 1386 -->數據庫為例):<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`think_data`</span>(
<span class="hljs-string">`id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">8</span>) <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span> AUTO_INCREMENT,
<span class="hljs-string">`data`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">255</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>)
) <span class="hljs-keyword">ENGINE</span>=MyISAM <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8 ;
<span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> <span class="hljs-string">`think_data`</span>(<span class="hljs-string">`id`</span>,<span class="hljs-string">`data`</span>) <span class="hljs-keyword">VALUES</span>
(<span class="hljs-number">1</span>,<span class="hljs-string">'thinkphp'</span>),
(<span class="hljs-number">2</span>,<span class="hljs-string">'php'</span>),
(<span class="hljs-number">3</span>,<span class="hljs-string">'framework'</span>);
</code></pre><p><!-- react-text: 1390 -->首先我們需要在應用的數據庫配置文件<!-- /react-text --><code>application/database.php</code><!-- react-text: 1392 -->中添加數據庫的連接信息如下:<!-- /react-text --></p><pre style="border: 1px solid silver;"><code><span class="hljs-keyword">return</span> [
<span class="hljs-comment">// 數據庫類型</span>
<span class="hljs-string">'type'</span> => <span class="hljs-string">'mysql'</span>,
<span class="hljs-comment">// 服務器地址</span>
<span class="hljs-string">'hostname'</span> => <span class="hljs-string">'127.0.0.1'</span>,
<span class="hljs-comment">// 數據庫名</span>
<span class="hljs-string">'database'</span> => <span class="hljs-string">'demo'</span>,
<span class="hljs-comment">// 數據庫用戶名</span>
<span class="hljs-string">'username'</span> => <span class="hljs-string">'root'</span>,
<span class="hljs-comment">// 數據庫密碼</span>
<span class="hljs-string">'password'</span> => <span class="hljs-string">''</span>,
<span class="hljs-comment">// 數據庫連接端口</span>
<span class="hljs-string">'hostport'</span> => <span class="hljs-string">''</span>,
<span class="hljs-comment">// 數據庫連接參數</span>
<span class="hljs-string">'params'</span> => [],
<span class="hljs-comment">// 數據庫編碼默認采用utf8</span>
<span class="hljs-string">'charset'</span> => <span class="hljs-string">'utf8'</span>,
<span class="hljs-comment">// 數據庫表前綴</span>
<span class="hljs-string">'prefix'</span> => <span class="hljs-string">'think_'</span>,
<span class="hljs-comment">// 數據庫調試模式</span>
<span class="hljs-string">'debug'</span> => <span class="hljs-keyword">true</span>,
];
</code></pre><p>接下來,我們修改下控制器方法,添加讀取數據的代碼:</p><pre style="border: 1px solid silver;"><code><span class="php"><span class="hljs-meta"><?php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Db</span>;
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span>
</span>{
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-params">()</span>
</span>{
$data = Db::name(<span class="hljs-string">'data'</span>)->find();
<span class="hljs-keyword">$this</span>->assign(<span class="hljs-string">'result'</span>, $data);
<span class="hljs-keyword">return</span> <span class="hljs-keyword">$this</span>->fetch();
}
}
</span></code></pre><p>定義好控制器后,我們修改模板文件,添加數據輸出標簽如下:</p><pre style="border: 1px solid silver;"><code><span class="xml"><span class="hljs-tag"><<span class="hljs-name">html</span>></span>
<span class="hljs-tag"><<span class="hljs-name">head</span>></span>
<span class="hljs-tag"><<span class="hljs-name">title</span>></span><span class="hljs-tag"></<span class="hljs-name">title</span>></span>
<span class="hljs-tag"></<span class="hljs-name">head</span>></span>
<span class="hljs-tag"><<span class="hljs-name">body</span>></span>
</span><span class="hljs-template-variable">{$result.id}</span><span class="xml">--</span><span class="hljs-template-variable">{$result.data}</span><span class="xml">
<span class="hljs-tag"></<span class="hljs-name">body</span>></span>
<span class="hljs-tag"></<span class="hljs-name">html</span>></span>
</span></code></pre><p><!-- react-text: 1402 -->模板標簽的用法和<!-- /react-text --><code>Smarty</code><!-- react-text: 1404 -->類似,就是用于輸出數據的字段,這里就表示輸出<!-- /react-text --><code>think_data</code><!-- react-text: 1406 -->表的<!-- /react-text --><code>id</code><!-- react-text: 1408 -->和<!-- /react-text --><code>data</code><!-- react-text: 1410 -->字段的值。<!-- /react-text --></p><p>我們訪問會輸出:</p><p><code>1--thinkphp</code></p><h2 data-line="611" class="line"><a id="_611"></a><!-- react-text: 1416 -->總結<!-- /react-text --></h2><p><!-- react-text: 1418 -->本章我們學習了如何安裝<!-- /react-text --><code>ThinkPHP</code><!-- react-text: 1420 -->和框架的目錄結構,如何創建項目的入口文件和開啟調試模式,并通過一個<!-- /react-text --><code>Hello,Name</code><!-- react-text: 1422 -->例子說明了如何定義控制器和模板,以及如何讀取數據庫的數據并在模板渲染輸出。<!-- /react-text --></p></div><!-- react-empty: 359 --></div>