# 快速入门(一):基础
本章介绍了`ThinkPHP5.0`的安装及基本使用,并给出了一个最简单的示例带你了解如何开始开发,主要包含:
- - [简介](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145249#u7B80u4ECB)
- [官网下载](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145249#u5B98u7F51u4E0Bu8F7D)
- [Composer安装和更新](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145249#composer-)
- [Git下载和更新](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145249#git-)
- [目录结构](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145249#u76EEu5F55u7ED3u6784)
- [运行环境](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145249#u8FD0u884Cu73AFu5883)
- [入口文件](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145249#u5165u53E3u6587u4EF6)
- [调试模式](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145249#u8C03u8BD5u6A21u5F0F)
- [控制器](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145249#u63A7u5236u5668)
- [视图](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145249#u89C6u56FE)
- [读取数据](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145249#u8BFBu53D6u6570u636E)
- [总结](http://ihavenolimitations.xyz/thinkphp/thinkphp5_quickstart/145249#u603Bu7ED3)
> #### 在学习`ThinkPHP5.0`之前,如果你还不理解面向对象和命名空间的概念,建议首先去PHP手册恶补下PHP的相关基础知识,否则将成为你学习5.0的最大障碍。
## 简介
`ThinkPHP`是一个快速、简单的基于`MVC`和面向对象的轻量级`PHP`开发框架,遵循`Apache2`开源协议发布,从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,尤其注重开发体验和易用性,并且拥有众多的原创功能和特性,为`WEB`应用和`API`开发提供了强有力的支持。
> `ThinkPHP5.0`版本是一个颠覆和重构版本,也是`ThinkPHP`十周年献礼版本,基于`PHP5.4`设计(完美支持`PHP7`),采用全新的架构思想,引入了很多的`PHP`新特性,优化了核心,减少了依赖,支持`Composer`,实现了真正的惰性加载,并且为`API`开发做了深入的支持,在功能、性能以及灵活性方面都较为突出。
## 官网下载
ThinkPHP最新的稳定版本可以在([官方网站下载页](http://thinkphp.cn/down/framework.html))下载,不过官网下载版本并不是实时更新的,我们会在每个版本更新发布的时候重新打包,如果你需要实时更新版本,请使用`Git`版本库或者`Composer`安装。
## Composer安装和更新
ThinkPHP`5.0`支持使用`Composer`安装和更新,如果还没有安装 `Composer`,你可以按 [Composer安装](http://ihavenolimitations.xyz/thinkphp/composer/35669) 中的方法安装。在 `Linux` 和 `Mac OS X` 中可以运行如下命令:
```
<pre class="calibre18">
```
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
```
```
在 `Windows` 中,你需要下载并运行 [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe)。
> ### 提示:
>
> - - - - - -
>
> 如果遇到任何问题或者想更深入地学习 Composer,请参考 [Composer 官方文档(英文)](https://getcomposer.org/doc/),看云上有 [Composer 的中文版本](http://ihavenolimitations.xyz/thinkphp/composer)。
如果你已经安装有 `Composer` 请确保使用的是最新版本,你可以用 `composer self-update` 命令更新为最新版本。
然后在命令行下面,切换到你的web根目录下面并执行下面的命令:
```
<pre class="calibre18">
```
composer <span class="hljs-operator"><span class="hljs-keyword">create</span>-<span class="hljs-keyword">project</span> topthink/think tp5 <span class="hljs-comment">--prefer-dist</span></span>
```
```
如果出现错误提示,请根据提示操作或者参考[Composer中文文档](http://ihavenolimitations.xyz/thinkphp/composer)。
如果之前使用`Composer`安装的话,首先切换到你的`tp5`目录,然后使用下面的命令更新框架到最新版本(注意因为缓存关系,`composer`不一定是及时更新的):
```
<pre class="calibre18">
```
<span class="hljs-title">composer</span> update
```
```
> ### 注意:
>
> - - - - - -
>
> 使用composer update更新核心框架会清空原来的核心框架目录,如果你定制了核心框架或者添加了扩展在核心目录的话,建议使用后面的Git方式更新。
由于众所周知的原因,国外的网站连接速度很慢,并且随时可能被“墙”甚至“不存在”。因此安装的时间可能会比较长,请耐心等待,或者通过下面的方式使用国内镜像。
> 打开命令行窗口(windows用户)或控制台(Linux、Mac 用户)并执行如下命令:
>
> ```
> <pre class="calibre21">
> ```
> composer config -g repo.packagist composer <span class="hljs-string">https:</span><span class="hljs-comment">//packagist.phpcomposer.com</span>
> ```
>
> ```
## Git下载和更新
`ThinkPHP`使用`Git`版本库进行更新,如果你不太了解`Composer`或者觉得`Composer`太慢,也可以使用`git`版本库安装和更新,`ThinkPHP5.0`拆分为多个仓库,主要包括:
- 应用项目:`https://github.com/top-think/think`
- 核心框架:`https://github.com/top-think/framework`
- 其它扩展: 参考 `https://github.com/top-think`
> ### 提示:
>
> - - - - - -
>
> 之所以设计为应用和核心仓库分离,是为了支持`Composer`单独更新核心框架。
如果你还没安装`Git`,可以参考阅读 [Pro Git第二版(中文)](http://ihavenolimitations.xyz/kancloud/progit)先。
首先克隆下载应用项目仓库
```
<pre class="calibre18">
```
<span class="hljs-title">git</span> clone <span class="hljs-operator">https://github.com/top-think/think</span> tp5
```
```
然后切换到`tp5`目录下面,再克隆核心框架仓库:
```
<pre class="calibre18">
```
<span class="hljs-title">git</span> clone <span class="hljs-operator">https://github.com/top-think/framework</span> thinkphp
```
```
两个仓库克隆完成后,就完成了`ThinkPHP5.0`的`Git`方式下载,如果需要更新核心框架的时候,只需要切换到thinkphp核心目录下面,然后执行:
```
<pre class="calibre18">
```
git pull <span class="hljs-string">https:</span><span class="hljs-comment">//github.com/top-think/framework</span>
```
```
如果不熟悉`git`命令行,可以使用任何一个GIT客户端进行操作,在此不再详细说明。
## 目录结构
`Composer` 安装后(或者下载后的压缩文件解压后)可以看到下面的目录结构:
```
<pre class="calibre18">
```
<span class="hljs-regexp">tp5</span>
├─<span class="hljs-regexp">application</span> 应用目录
├─<span class="hljs-regexp">extend</span> 扩展类库目录(可定义)
├─<span class="hljs-regexp">public</span> 对外访问目录
├─<span class="hljs-regexp">runtime</span> 运行时目录(可定义)
├─<span class="hljs-regexp">vendor</span> 第三方类库目录(<span class="hljs-regexp">Composer</span>)
├─<span class="hljs-regexp">thinkphp</span> 框架核心目录
├─<span class="hljs-regexp">build</span><span class="hljs-regexp">.php</span> 自动生成定义文件(参考)
├─<span class="hljs-regexp">composer</span><span class="hljs-regexp">.json</span> <span class="hljs-regexp">Composer</span>定义文件
├─<span class="hljs-regexp">LICENSE</span><span class="hljs-regexp">.txt</span> 授权说明文件
├─<span class="hljs-regexp">README</span><span class="hljs-regexp">.md</span> <span class="hljs-regexp">README</span> 文件
├─<span class="hljs-regexp">think</span> 命令行工具
```
```
> ### 注意:
>
> - - - - - -
>
> 如果在linux环境下面的话,需要给`runtime`目录`755`权限。
tp5所在的目录被定义为应用根目录(`ROOT_PATH`常量定义),`thinkphp`子目录是框架核心目录(`THINK_PATH`常量定义),其目录结构如下:
```
<pre class="calibre18">
```
├─<span class="hljs-regexp">thinkphp</span> 框架系统目录
│ ├─<span class="hljs-regexp">lang</span> 语言包目录
│ ├─<span class="hljs-regexp">library</span> 框架核心类库目录
│ │ ├─<span class="hljs-regexp">think</span> <span class="hljs-regexp">think</span> 类库包目录
│ │ └─<span class="hljs-regexp">traits</span> 系统 <span class="hljs-regexp">traits</span> 目录
│ ├─<span class="hljs-regexp">tpl</span> 系统模板目录
│ │
│ ├─<span class="hljs-regexp">.htaccess</span> 用于 <span class="hljs-regexp">apache</span> 的重写
│ ├─<span class="hljs-regexp">.travis</span><span class="hljs-regexp">.yml</span> <span class="hljs-regexp">CI</span> 定义文件
│ ├─<span class="hljs-regexp">base</span><span class="hljs-regexp">.php</span> 框架基础文件
│ ├─<span class="hljs-regexp">composer</span><span class="hljs-regexp">.json</span> <span class="hljs-regexp">composer</span> 定义文件
│ ├─<span class="hljs-regexp">console</span><span class="hljs-regexp">.php</span> 控制台入口文件
│ ├─<span class="hljs-regexp">convention</span><span class="hljs-regexp">.php</span> 惯例配置文件
│ ├─<span class="hljs-regexp">helper</span><span class="hljs-regexp">.php</span> 助手函数文件(可选)
│ ├─<span class="hljs-regexp">LICENSE</span><span class="hljs-regexp">.txt</span> 授权说明文件
│ ├─<span class="hljs-regexp">phpunit</span><span class="hljs-regexp">.xml</span> 单元测试配置文件
│ ├─<span class="hljs-regexp">README</span><span class="hljs-regexp">.md</span> <span class="hljs-regexp">README</span> 文件
│ └─<span class="hljs-regexp">start</span><span class="hljs-regexp">.php</span> 框架引导文件
```
```
## 运行环境
> ThinkPHP5的环境要求如下:
>
> - PHP >= 5.4.0
> - PDO PHP Extension
> - MBstring PHP Extension
> - CURL PHP Extension
在开始之前,你需要一个`Web`服务器和**`PHP5.4+`**运行环境,如果你暂时还没有,我们推荐使用集成开发环境[WAMPServer](http://www.wampserver.com/en/)(Windows系统下集成Apache、PHP和MySQL的服务套件)来使用`ThinkPHP`进行本地开发和测试,最新版本的WAMP在[这里下载](https://sourceforge.net/projects/wampserver/files/WampServer%203/)。
如果你不想安装任何`WEB`服务器,也可以直接使用PHP自带的`WebServer`,并且运行`router.php`来运行测试。
我们进入命令行,进入`tp5/public`目录后,输入如下命令:
```
<pre class="calibre18">
```
<span class="hljs-title">php</span> -S localhost:<span class="hljs-number">8888</span> router.php
```
```
接下来可以直接访问
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//localhost:8888</span>
```
```
> 注意: S 一定要大写,端口号可以随意设置,只要和已有的不冲突,如果要停止服务,直接在命令行下面按`CTRL+C` 即可退出。
## 入口文件
`ThinkPHP5.0`版本的默认自带的入口文件位于`public/index.php`(实际部署的时候`public`目录为你的应用对外访问目录),入口文件内容如下:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 定义应用目录</span>
define(<span class="hljs-string">'APP_PATH'</span>, <span class="hljs-keyword">__DIR__</span> . <span class="hljs-string">'/../application/'</span>);
<span class="hljs-comment">// 加载框架引导文件</span><span class="hljs-keyword">require</span> <span class="hljs-keyword">__DIR__</span> . <span class="hljs-string">'/../thinkphp/start.php'</span>;
```
```
这段代码的作用就是定义应用目录`APP_PATH`和加载`ThinkPHP`框架的入口文件,这是所有基于`ThinkPHP`开发应用的第一步。
我们可以在浏览器中访问入口文件
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//localhost/tp5/public/</span>
```
```
运行后我们会看到欢迎页面:
![](https://img.kancloud.cn/de/97/de97ab7cfb03743ef91bb883b6b2578e_589x312.png)
官方提供的默认应用的实际目录结构和说明如下:
```
<pre class="calibre18">
```
├─<span class="hljs-regexp">application</span> 应用目录(可设置)
│ ├─<span class="hljs-regexp">index</span> 模块目录(可更改)
│ │ ├─<span class="hljs-regexp">config</span><span class="hljs-regexp">.php</span> 模块配置文件
│ │ ├─<span class="hljs-regexp">common</span><span class="hljs-regexp">.php</span> 模块公共文件
│ │ ├─<span class="hljs-regexp">controller</span> 控制器目录
│ │ ├─<span class="hljs-regexp">model</span> 模型目录
│ │ └─<span class="hljs-regexp">view</span> 视图目录
│ │
│ ├─<span class="hljs-regexp">command</span><span class="hljs-regexp">.php</span> 命令行工具配置文件
│ ├─<span class="hljs-regexp">common</span><span class="hljs-regexp">.php</span> 应用公共文件
│ ├─<span class="hljs-regexp">config</span><span class="hljs-regexp">.php</span> 应用配置文件
│ ├─<span class="hljs-regexp">tags</span><span class="hljs-regexp">.php</span> 应用行为扩展定义文件
│ ├─<span class="hljs-regexp">database</span><span class="hljs-regexp">.php</span> 数据库配置文件
│ └─<span class="hljs-regexp">route</span><span class="hljs-regexp">.php</span> 路由配置文件
```
```
5.0版本采用模块化的设计架构,默认的应用目录下面只有一个`index`模块目录,如果我要添加新的模块可以使用控制台命令来生成。
切换到命令行模式下,进入到应用根目录并执行如下指令:
```
<pre class="calibre18">
```
php think build --<span class="hljs-operator"><span class="hljs-keyword">module</span> <span class="hljs-title1">demo</span></span>
```
```
就会生成一个默认的demo模块,包括如下目录结构:
```
<pre class="calibre18">
```
├─<span class="hljs-regexp">demo</span>
│ ├─<span class="hljs-regexp">controller</span> 控制器目录
│ ├─<span class="hljs-regexp">model</span> 模型目录
│ ├─<span class="hljs-regexp">view</span> 视图目录
│ ├─<span class="hljs-regexp">config</span><span class="hljs-regexp">.php</span> 模块配置文件
│ └─<span class="hljs-regexp">common</span><span class="hljs-regexp">.php</span> 模块公共文件
```
```
同时也会生成一个默认的`Index`控制器文件。
> 注意:这只是一个初始默认的目录结构,在实际的开发过程中可能需要创建更多的目录和文件。
在后面的示例中,为了方便访问,我们设置`vhost`访问,以`apache`为例的话定义如下:
```
<pre class="calibre18">
```
<span class="hljs-regexp"><VirtualHost *:80></span><span class="hljs-keyword"><span class="hljs-operator">DocumentRoot</span></span> <span class="hljs-string">"/home/www/tp5/public"</span><span class="hljs-keyword"><span class="hljs-operator">ServerName</span></span> tp5.com
<span class="hljs-regexp"></VirtualHost></span>
```
```
> 把`DocumentRoot`修改为你本机`tp5/public`所在目录,并注意修改本机的`hosts`文件把`tp5.com`指向本地`127.0.0.1`。
如果你暂时不想设置`vhost`或者还不是特别了解如何设置,可以先把入口文件移动到框架的`ROOT_PATH`目录,并更改入口文件中的`APP_PATH`和框架入口文件的位置(这里顺便展示下如何更改相关目录名称),`index.php`文件内容如下:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 定义应用目录为apps</span>
define(<span class="hljs-string">'APP_PATH'</span>, <span class="hljs-keyword">__DIR__</span> . <span class="hljs-string">'/apps/'</span>);
<span class="hljs-comment">// 加载框架引导文件</span><span class="hljs-keyword">require</span> <span class="hljs-keyword">__DIR__</span> . <span class="hljs-string">'/think/start.php'</span>;
```
```
这样最终的应用目录结构如下:
```
<pre class="calibre18">
```
tp5
├─<span class="hljs-keyword">index</span>.php 应用入口文件
├─apps 应用目录
├─<span class="hljs-keyword">public</span> 资源文件目录
├─runtime 运行时目录
└─think 框架目录
```
```
实际的访问URL变成了
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//localhost/tp5/</span>
```
```
> ### 提示:
>
> - - - - - -
>
> 如非特别说明,我们后面的示例均以`tp5.com`进行访问,如果你使用了其它的方式请自行修改。
## 调试模式
`ThinkPHP`支持调试模式,默认情况下是开启状态。调试模式以除错方便优先,而且在异常的时候可以显示尽可能多的信息,所以对性能有一定的影响。
我们强烈建议开发者在使用`ThinkPHP`开发的过程中使用调试模式,`5.0`默认情况下可以捕获到任何细微的错误并抛出异常,这样可以更好的获取错误提示和避免一些问题和隐患。
开发完成后,我们实际进行项目部署的时候,修改应用配置文件(`application/config.php`)中的`app_debug`配置参数:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 关闭调试模式</span><span class="hljs-string">'app_debug'</span> => <span class="hljs-keyword">false</span>,
```
```
> 为了安全考虑,避免泄露你的服务器WEB目录信息等资料,一定记得正式部署的时候关闭调试模式。
## 控制器
我们找到`index`模块的`Index`控制器(文件位于`application/index/controller/Index.php` 注意大小写),我们把`Index`控制器类的`index`方法修改为`Hello,World!`。
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?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-operator"><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-number">()</span></span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,World!'</span>;
}
}</span>
```
```
> ### 提示:
>
> - - - - - -
>
> 根据类的命名空间可以快速定位文件位置,在`ThinkPHP5.0`的规范里面,命名空间其实对应了文件的所在目录,`app`命名空间通常代表了文件的起始目录为`application`,而`think`命名空间则代表了文件的其实目录为`thinkphp/library/think`,后面的命名空间则表示从起始目录开始的子目录。
我们访问URL地址
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com</span>
```
```
就会看到`Hello,World!`的输出结果。
> 如果要继承一个公共的控制器类,可以使用:
>
> ```
> <pre class="calibre21">
> ```
> <?php
> namespace app\index\controller;
>
> use app\index\controller\<span class="hljs-operator">Base</span>;
>
> <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">Base</span></span>{
> public function index()
> {
> <span class="hljs-keyword">return</span> <span class="hljs-operator">'Hello</span>,<span class="hljs-operator">World</span>!';
> }
> }
> ```
>
> ```
可以为操作方法定义参数,例如:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?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-operator"><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-number">(<span class="hljs-regexp">$name</span> = <span class="hljs-string">'World'</span>)</span></span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'Hello,'</span> . <span class="hljs-regexp">$name</span> . <span class="hljs-string">'!'</span>;
}
}</span>
```
```
当我们带`name`参数访问入口文件地址(例如 `http://tp5.com?name=ThinkPHP`)的时候,在浏览器中可以看到如下输出:
`Hello,ThinkPHP!`
控制器类可以包括多个操作方法,但如果你的操作方法是`protected`或者`private`类型的话,是无法直接通过URL访问到该操作的,也就是说只有`public`类型的操作才是可以通过URL访问的。
我们来验证下,把`Index`控制器类的方法修改为:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?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-operator"><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-number">()</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-number">()</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-number">()</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-number">()</span></span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'这是private方法!'</span>;
}
}</span>
```
```
当我们访问如下URL地址的时候,前面两个是正常访问,后面两个则会显示异常。
```
<pre class="calibre18">
```
http:<span class="hljs-regexp">//tp</span>5.com/<span class="hljs-keyword">index</span>.php/<span class="hljs-keyword">index</span>/<span class="hljs-keyword">index</span>/hello
http:<span class="hljs-regexp">//tp</span>5.com/<span class="hljs-keyword">index</span>.php/<span class="hljs-keyword">index</span>/<span class="hljs-keyword">index</span>/test
http:<span class="hljs-regexp">//tp</span>5.com/<span class="hljs-keyword">index</span>.php/<span class="hljs-keyword">index</span>/<span class="hljs-keyword">index</span>/hello2
http:<span class="hljs-regexp">//tp</span>5.com/<span class="hljs-keyword">index</span>.php/<span class="hljs-keyword">index</span>/<span class="hljs-keyword">index</span>/hello3
```
```
当我们访问`hello2`和`hello3`操作方法后的结果都会显示类似的异常信息:
![](https://img.kancloud.cn/80/f0/80f0dc19aad319f5a7393f2abadd9ab5_1162x716.png)
异常页面包含了详细的错误信息,是因为开启了调试模式,如果关闭调试模式的话,看到的默认信息如下:
![](https://img.kancloud.cn/61/a3/61a32596261d3f208c303cf7ff7bd533_852x175.png)
## 视图
现在我们在给控制器添加视图文件功能,我们在`application/index`目录下面创建一个`view`目录,然后添加模板文件`view/index/hello.html`,我们添加模板内容如下:
```
<pre class="calibre18">
```
<span class="hljs-regexp"><<span class="hljs-operator">html</span>></span><span class="hljs-regexp"><<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">title</span>></span>hello {$name}<span class="hljs-regexp"></<span class="hljs-operator">title</span>></span><span class="hljs-regexp"></<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">body</span>></span>
hello, {$name}!
<span class="hljs-regexp"></<span class="hljs-operator">body</span>></span><span class="hljs-regexp"></<span class="hljs-operator">html</span>></span>
```
```
要输出视图,必须在控制器方法中进行模板渲染输出操作,现在修改控制器类如下:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?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-operator"><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-number">(<span class="hljs-regexp">$name</span> = <span class="hljs-string">'thinkphp'</span>)</span></span>{
<span class="hljs-regexp">$this</span>->assign(<span class="hljs-string">'name'</span>, <span class="hljs-regexp">$name</span>);
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->fetch();
}
}</span>
```
```
> ### \[ 新手须知 \]
>
> - - - - - -
>
> 这里使用了`use`来导入一个命名空间的类库,然后可以在当前文件中直接使用该别名而不需要使用完整的命名空间路径访问类库。也就说,如果没有使用
>
> ```
> <pre class="calibre25">
> ```
>
> <span class="hljs-operator"><span class="hljs-keyword">use</span> think\Controller;</span>
>
> ```
>
> ```
>
> 就必须使用
>
> ```
> <pre class="calibre25">
> ```
>
> <span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Index</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">\think\Controller</span></span>
>
> ```
>
> ```
>
> 这种完整命名空间方式。
>
> 在后面的内容中,如果我们直接调用系统的某个类的话,都会假设已经在类的开头使用`use`进行了别名导入。
注意,`Index`控制器类继承了 `think\Controller`类之后,我们可以直接使用封装好的`assign`和`fetch`方法进行模板变量赋值和渲染输出。
`fetch`方法中我们没有指定任何模板,所以按照系统默认的规则(**视图目录/控制器/操作方法**)输出了`view/index/hello.html`模板文件。
接下来,我们在浏览器访问
```
<pre class="calibre18">
```
http:<span class="hljs-regexp">//tp</span>5.com/<span class="hljs-keyword">index</span>.php/<span class="hljs-keyword">index</span>/<span class="hljs-keyword">index</span>/hello
```
```
输出:
`hello,thinkphp!`
## 读取数据
在开始之前,我们首先在数据库`demo`中创建一个`think_data`数据表(这里以`mysql`数据库为例):
```
<pre class="calibre18">
```
<span class="hljs-operator"><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-number">int</span>(<span class="hljs-number">8</span>) <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">NOT</span> <span class="hljs-number">NULL</span> AUTO_INCREMENT,
<span class="hljs-string">`data`</span> <span class="hljs-number">varchar</span>(<span class="hljs-number">255</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-number">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>
<span class="hljs-operator"><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>);</span>
```
```
首先我们需要在应用的数据库配置文件`application/database.php`中添加数据库的连接信息如下:
```
<pre class="calibre18">
```
<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>,
];
```
```
接下来,我们修改下控制器方法,添加读取数据的代码:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?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-operator"><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-number">()</span></span>{
<span class="hljs-regexp">$data</span> = Db::name(<span class="hljs-string">'data'</span>)->find();
<span class="hljs-regexp">$this</span>->assign(<span class="hljs-string">'result'</span>, <span class="hljs-regexp">$data</span>);
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->fetch();
}
}</span>
```
```
定义好控制器后,我们修改模板文件,添加数据输出标签如下:
```
<pre class="calibre18">
```
<span class="hljs-regexp"><<span class="hljs-operator">html</span>></span><span class="hljs-regexp"><<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">title</span>></span><span class="hljs-regexp"></<span class="hljs-operator">title</span>></span><span class="hljs-regexp"></<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">body</span>></span>
{$result.id}--{$result.data}
<span class="hljs-regexp"></<span class="hljs-operator">body</span>></span><span class="hljs-regexp"></<span class="hljs-operator">html</span>></span>
```
```
模板标签的用法和`Smarty`类似,就是用于输出数据的字段,这里就表示输出`think_data`表的`id`和`data`字段的值。
我们访问会输出:
`1--thinkphp`
## 总结
本章我们学习了如何安装`ThinkPHP`和框架的目录结构,如何创建项目的入口文件和开启调试模式,并通过一个`Hello,Name`例子说明了如何定义控制器和模板,以及如何读取数据库的数据并在模板渲染输出。
- 脕茫隆垄脨貌脩脭
- 脕茫隆垄脨貌脩脭
- 脪禄隆垄禄霉麓隆
- 脪禄隆垄禄霉麓隆
- 露镁隆垄URL潞脥脗路脫脡
- 露镁隆垄URL潞脥脗路脫脡
- 脠媒隆垄脟毛脟贸潞脥脧矛脫娄
- 脠媒隆垄脟毛脟贸潞脥脧矛脫娄
- 脣脛隆垄脢媒戮脻驴芒
- 脣脛隆垄脢媒戮脻驴芒
- 脦氓隆垄虏茅脩炉脫茂脩脭
- 脦氓隆垄虏茅脩炉脫茂脩脭
- 脕霉隆垄脛拢脨脥潞脥鹿脴脕陋
- 拢篓1拢漏脛拢脨脥露篓脪氓
- 拢篓2拢漏禄霉麓隆虏脵脳梅
- 拢篓3拢漏露脕脠隆脝梅潞脥脨脼赂脛脝梅
- 拢篓4拢漏脌脿脨脥脳陋禄禄潞脥脳脭露炉脥锚鲁脡
- 拢篓5拢漏虏茅脩炉路露脦搂
- 拢篓6拢漏脢盲脠毛潞脥脩茅脰陇
- 拢篓7拢漏鹿脴脕陋
- 拢篓8拢漏脛拢脨脥脢盲鲁枚
- 脝脽隆垄脢脫脥录潞脥脛拢掳氓
- 脝脽隆垄脢脫脥录潞脥脛拢掳氓
- 掳脣隆垄碌梅脢脭潞脥脠脮脰戮
- 掳脣隆垄碌梅脢脭潞脥脠脮脰戮
- 戮脜隆垄API驴陋路垄
- 戮脜隆垄API驴陋路垄
- 脢庐隆垄脙眉脕卯脨脨鹿陇戮脽
- 脢庐隆垄脙眉脕卯脨脨鹿陇戮脽
- 脢庐脪禄隆垄脌漏脮鹿
- 脢庐脪禄隆垄脌漏脮鹿
- 脢庐露镁隆垄脭脫脧卯
- Cookie
- Session
- 碌楼脭陋虏芒脢脭
- 脥录脧帽麓娄脌铆
- 脦脛录镁脡脧麓芦
- 脩茅脰陇脗毛
- 赂陆脗录
- A隆垄鲁拢录没脦脢脤芒录炉
- B隆垄3.2潞脥5.0脟酶卤冒
- C隆垄脰煤脢脰潞炉脢媒
- 路卢脥芒脝陋拢潞脩搂脧掳ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路卢脥芒脝陋拢潞脩搂脧掳ThinkPHP5碌脛脮媒脠路脳脣脢脝