ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
<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 -->,你可以按&nbsp;<!-- /react-text --><a href="http://www.kancloud.cn/thinkphp/composer/35669" target="_blank">Composer安装</a><!-- react-text: 808 -->&nbsp;中的方法安装。在 <!-- /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 --> 中,你需要下载并运行&nbsp;<!-- /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,请参考&nbsp;<!-- /react-text --><a href="https://getcomposer.org/doc/" target="_blank">Composer 官方文档(英文)</a><!-- react-text: 828 -->,看云上有 <!-- /react-text --><a href="http://www.kancloud.cn/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 --> 请确保使用的是最新版本,或者可以用&nbsp;<!-- /react-text --><code>composer self-update</code><!-- react-text: 836 -->&nbsp;命令更新为最新版本。<!-- /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.kancloud.cn/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.kancloud.cn/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 &gt;= 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">&lt;VirtualHost *:80&gt;</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">&lt;/VirtualHost&gt;</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> =&gt; <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">&lt;?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">&lt;?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> =&gt; <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">&lt;?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">&lt;?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">&lt;?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">&lt;<span class="hljs-name">html</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>hello </span><span class="hljs-template-variable">{$name}</span><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span> hello, </span><span class="hljs-template-variable">{$name}</span><span class="xml">! <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span> </span></code></pre><p>要输出视图,必须在控制器方法中进行模板渲染输出操作,现在修改控制器类如下:</p><pre style="border: 1px solid silver;"><code><span class="php"><span class="hljs-meta">&lt;?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>-&gt;assign(<span class="hljs-string">'name'</span>, $name); <span class="hljs-keyword">return</span> <span class="hljs-keyword">$this</span>-&gt;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> =&gt; <span class="hljs-string">'mysql'</span>, <span class="hljs-comment">// 服务器地址</span> <span class="hljs-string">'hostname'</span> =&gt; <span class="hljs-string">'127.0.0.1'</span>, <span class="hljs-comment">// 数据库名</span> <span class="hljs-string">'database'</span> =&gt; <span class="hljs-string">'demo'</span>, <span class="hljs-comment">// 数据库用户名</span> <span class="hljs-string">'username'</span> =&gt; <span class="hljs-string">'root'</span>, <span class="hljs-comment">// 数据库密码</span> <span class="hljs-string">'password'</span> =&gt; <span class="hljs-string">''</span>, <span class="hljs-comment">// 数据库连接端口</span> <span class="hljs-string">'hostport'</span> =&gt; <span class="hljs-string">''</span>, <span class="hljs-comment">// 数据库连接参数</span> <span class="hljs-string">'params'</span> =&gt; [], <span class="hljs-comment">// 数据库编码默认采用utf8</span> <span class="hljs-string">'charset'</span> =&gt; <span class="hljs-string">'utf8'</span>, <span class="hljs-comment">// 数据库表前缀</span> <span class="hljs-string">'prefix'</span> =&gt; <span class="hljs-string">'think_'</span>, <span class="hljs-comment">// 数据库调试模式</span> <span class="hljs-string">'debug'</span> =&gt; <span class="hljs-keyword">true</span>, ]; </code></pre><p>接下来,我们修改下控制器方法,添加读取数据的代码:</p><pre style="border: 1px solid silver;"><code><span class="php"><span class="hljs-meta">&lt;?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>)-&gt;find(); <span class="hljs-keyword">$this</span>-&gt;assign(<span class="hljs-string">'result'</span>, $data); <span class="hljs-keyword">return</span> <span class="hljs-keyword">$this</span>-&gt;fetch(); } } </span></code></pre><p>定义好控制器后,我们修改模板文件,添加数据输出标签如下:</p><pre style="border: 1px solid silver;"><code><span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</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">&lt;/<span class="hljs-name">body</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</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>