ThinkPHP 5.1 开发入门教程
ThinkPHP 是一个开源的、快速、简单的面向对象的轻量级 PHP 开发框架,遵循 Apache2.0 协议发布,ThinkPHP 5 是一个颠覆和重构版本,采用更严格的 PSR 规范,更适合现代 Web 应用开发。

本教程将以 ThinkPHP 5.1 版本为例进行讲解,因为它是目前最稳定、使用最广泛的 5.x 版本。
目录
- ThinkPHP 是什么?为什么选择它?
- 环境准备
- 安装 ThinkPHP
- 项目目录结构详解
- MVC 架构初探
- 配置文件
- 路由配置
- 数据库操作
- 视图与模板引擎
- 表单提交与数据验证
- 实战:一个简单的留言板
- 总结与进阶
ThinkPHP 是什么?为什么选择它?
- 是什么:ThinkPHP 是一个 PHP Web 应用开发框架,它封装了项目中常用的功能,如路由、数据库操作、模板引擎、缓存等,让你能更专注于业务逻辑的开发,而不用重复“造轮子”。
- 为什么选择它:
- 简单易学:文档齐全,社区活跃,对新手友好。
- 功能强大:内置了丰富的功能组件,开箱即用。
- 性能优越:经过多次优化,性能表现优秀。
- 生态完善:拥有大量的扩展库和成熟的商业支持。
- 遵循 PSR 标准:与现代 PHP 开发规范接轨,代码更规范。
环境准备
在开始之前,你需要确保你的开发环境满足以下要求:
- PHP 版本:ThinkPHP 5.1 要求 PHP
>=5.6.0,推荐使用 PHP1.x或更高版本。 - 扩展:需要开启
PDO和PDO_MySQL(或PDO_SQLite) 扩展。 - Web 服务器:
Apache(需要开启mod_rewrite) 或Nginx。 - 数据库:
MySQL(推荐6+) 或SQLite、PostgreSQL等。
对于新手,最简单的方式是使用集成环境,如:
- phpStudy (Windows)
- XAMPP (Windows, macOS, Linux)
- MAMP (macOS)
- 宝塔面板 (Linux, Windows, macOS)
安装好集成环境后,确保 PHP 版本符合要求,并勾选 PDO 和 PDO_MySQL 扩展。

安装 ThinkPHP
这里我们介绍两种常见的安装方式:手动安装和 Composer 安装。
手动安装(推荐新手)
- 下载框架:访问 ThinkPHP 官网或 GitHub 下载 ThinkPHP 5.1 的完整版压缩包。
- 解压到 Web 目录:将下载的
thinkphp_5.1.x_with_extend.zip解压,并将其中的thinkphp文件夹(或解压后根目录下的所有文件)复制到你 Web 服务器的根目录下(如phpStudy的WWW目录)。 - 访问验证:启动你的 Web 服务器,在浏览器中访问
http://localhost/。- 如果看到 ThinkPHP 的欢迎页面,说明安装成功!
- 如果看到
You don't have permission to access / on this server.,这说明你的 Web 服务器入口文件(index.php)没有被正确识别,请确保你的 Web 服务器配置正确(Apache 的mod_rewrite已开启)。
Composer 安装(推荐专业开发者)
- 安装 Composer:如果你的系统还没有安装 Composer,请先从 getcomposer.org 下载并安装。
- 创建项目:打开命令行(CMD 或 Terminal),进入你想要存放项目的目录(如
WWW),然后运行:# 在当前目录下创建一个名为 myapp 的新项目 composer create-project topthink/think myapp
- 访问验证:命令执行完成后,会在
myapp目录下生成一个完整的 ThinkPHP 项目,在浏览器中访问http://localhost/myapp/,即可看到欢迎页面。
项目目录结构详解
成功安装后,了解项目的目录结构至关重要,以下是核心目录的说明:
myapp/
├── app/ # 应用目录
│ ├── controller/ # 控制器目录
│ ├── model/ # 模型目录
│ ├── view/ # 视图目录
│ └── ... # 其他应用目录
├── config/ # 配置文件目录
├── public/ # WEB 部署目录(对外访问目录)
│ ├── static/ # 静态资源目录
│ └── index.php # 入口文件
├── route/ # 路由目录
├── extend/ # 扩展类库目录
├── runtime/ # 应用的运行时目录(日志、缓存等)
├── thinkphp/ # 框架核心目录
├── vendor/ # Composer 依赖目录
├── .example.env # 环境变量示例文件
└── composer.json # Composer 配置文件
public/:这是唯一需要对外暴露的目录,所有对网站的请求都通过public/index.php进入。app/:你的业务代码主要写在这里。config/:存放各种配置文件,如数据库、应用设置等。runtime/:框架运行时产生的文件,如日志、会话、缓存,此目录需要设置可写权限。
MVC 架构初探
ThinkPHP 遵循经典的 MVC 设计模式。
M - Model (模型)
模型负责与数据库进行交互,处理数据的业务逻辑(如数据验证、数据关联等),一个模型通常对应一张数据表。

示例:创建一个 User 模型
在 app/model 目录下创建 User.php 文件:
<?php
namespace app\model;
use think\Model;
class User extends Model
{
// 设置数据表名(如果与模型名不同)
// protected $name = 'my_user';
// 设置主键
// protected $pk = 'uid';
}
V - View (视图)
视图是用户看到的界面,通常用于展示数据,在 ThinkPHP 中,视图文件是 HTML 文件,但可以嵌入 PHP 代码和 ThinkPHP 的模板引擎标签。
示例:创建一个视图
在 app/view/index 目录下创建 hello.html 文件:
<!DOCTYPE html>
<html>
<head>你好,ThinkPHP!</title>
</head>
<body>
<h1>{$name}</h1>
<p>今天是个好日子。</p>
</body>
</html>
C - Controller (控制器)
控制器是模型和视图之间的桥梁,接收用户的请求,调用模型处理数据,然后选择合适的视图返回给用户。
示例:创建一个控制器
在 app/controller 目录下创建 Index.php 文件:
<?php
namespace app\controller;
use think\Request;
use app\model\User; // 引入模型
class Index
{
public function hello($name = 'ThinkPHP')
{
// 向视图传递变量
return view('index/hello', ['name' => $name]);
}
public function user($id)
{
// 使用模型查询数据
$user = User::find($id);
if ($user) {
return json($user->toArray()); // 返回 JSON 格式的数据
} else {
return '用户不存在';
}
}
}
如何访问?
默认情况下,访问 http://localhost/你的项目名/index.php/index/hello/name/World,就会调用 Index 控制器的 hello 方法,并传递 name 参数为 World。
配置文件
ThinkPHP 的配置文件非常灵活,支持多种格式。
- 全局配置:位于
config/目录下,如app.php(应用配置),database.php(数据库配置)。 - 环境配置:推荐使用
.env文件来管理环境变量,如数据库连接信息,你可以复制.example.env为.env并进行修改。
示例:配置数据库 (config/database.php)
return [
// 默认使用的数据库连接配置
'default' => env('database.driver', 'mysql'),
// 自定义时间查询规则
'time_query_rule' => [],
// 自动写入时间戳字段
'auto_timestamp' => true,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
// 数据库连接配置信息
'connections' => [
'mysql' => [
// 数据库类型
'type' => env('database.type', 'mysql'),
// 服务器地址
'hostname' => env('database.hostname', '127.0.0.1'),
// 数据库名
'database' => env('database.database', 'test'),
// 用户名
'username' => env('database.username', 'root'),
// 密码
'password' => env('database.password', 'root'),
// 端口
'hostport' => env('database.hostport', '3306'),
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => env('database.charset', 'utf8'),
// 数据库表前缀
'prefix' => env('database.prefix', ''),
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 是否需要断线重连
'break_reconnect' => false,
// 监听SQL
'trigger_sql' => env('app_debug', true),
// 开启字段缓存
'fields_cache' => false,
],
],
];
使用 .env 文件:
APP_DEBUG = true
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = test
USERNAME = root
PASSWORD = your_password
HOSTPORT = 3306
CHARSET = utf8
DEBUG = true
路由配置
路由用于将 URL 请求映射到对应的控制器和方法上,使 URL 更美观、更友好。
ThinkPHP 的路由配置文件在 route/ 目录下。
示例:定义一个路由
编辑 route/app.php 文件:
<?php
use think\facade\Route;
// 首页路由
Route::get('index', 'Index/index');
// 带参数的路由
Route::get('hello/:name', 'Index/hello');
// 资源路由,会自动生成多个常用路由(增删改查)
Route::resource('user', 'User');
定义路由后,访问 http://localhost/你的项目名/index.php/hello/World,就会直接调用 Index 控制器的 hello 方法。
数据库操作
ThinkPHP 提供了非常便捷的数据库操作方式。
数据库配置
如上所述,在 config/database.php 和 .env 文件中配置好你的数据库信息。
使用 Db 类进行增删改查
Db 类是 ThinkPHP 提供的静态门面,用于进行原生的 SQL 查询,它不依赖于模型。
use think\facade\Db;
// 1. 查询
// 查询一条记录
$user = Db::table('user')->where('id', 1)->find();
// 查询多条记录
$list = Db::table('user')->where('status', 1)->select();
// 2. 插入
$data = ['name' => '张三', 'email' => 'zhangsan@example.com', 'create_time' => time()];
$lastInsertId = Db::table('user')->insertGetId($data);
// 3. 更新
Db::table('user')->where('id', $lastInsertId)->update(['name' => '李四']);
// 4. 删除
Db::table('user')->where('id', $lastInsertId)->delete();
使用模型进行增删改查
使用模型进行操作更加面向对象,推荐使用。
use app\model\User;
// 1. 查询
// 查询一条记录
$user = User::find(1);
// 或者使用 where
$user = User::where('name', '张三')->find();
// 查询多条记录
$list = User::where('status', 1)->select();
// 2. 插入
$user = new User;
$user->name = '王五';
$user->email = 'wangwu@example.com';
$user->save(); // 返回布尔值
// 或者使用静态方法
$user = User::create([
'name' => '赵六',
'email' => 'zhaoliu@example.com'
]);
// 3. 更新
$user = User::find(1);
$user->name = '钱七';
$user->save();
// 4. 删除
$user = User::find(1);
$user->delete();
视图与模板引擎
视图文件存放在 app/view/ 目录下,子目录名对应控制器名,文件名对应方法名。
变量输出
在控制器中传递变量给视图:
return view('index/index', ['title' => '首页', 'list' => [1, 2, 3]]);
在视图文件 app/view/index/index.html 中输出:
<h1>{$title}</h1>
<ul>
{volist name="list" id="vo"}
<li>{$vo}</li>
{/volist}
</ul>
循环与判断
volist:循环数组{volist name="users" id="user"} <p>ID: {$user.id}, 姓名: {$user.name}</p> {/volist}for:for 循环{for start="1" end="10" step="1" name="i"} <p>{$i}</p> {/for}if/elseif/else:条件判断{if $user.age > 18} <p>已成年</p> {elseif $user.age > 12} <p>青少年</p> {else /} <p>儿童</p> {/if}
包含文件
使用 include 标签可以引入其他模板文件,便于复用。
{include file="public/header" /}
<!-- 页面内容 -->
{include file="public/footer" /}
public/header.html 和 public/footer.html 文件应放在 app/view/ 目录下。
表单提交与数据验证
表单提交
在视图中创建一个表单:
<form action="{:url('user/save')}" method="post">
<input type="hidden" name="__token__" value="{:token()}">
<p>姓名:<input type="text" name="name"></p>
<p>邮箱:<input type="text" name="email"></p>
<p><input type="submit" value="提交"></p>
</form>
{:url('user/save')}:使用url助手函数生成提交地址,指向User控制器的save方法。{:token()}:用于 CSRF 防护,ThinkPHP 默认开启。
数据验证
在控制器中接收数据并进行验证。
namespace app\controller;
use think\Request;
use think\facade\Validate;
class User
{
public function save(Request $request)
{
// 1. 获取数据
$data = $request->post();
// 2. 验证规则
$rule = [
'name' => 'require|max:25',
'email' => 'require|email',
];
// 3. 验证提示信息
$msg = [
'name.require' => '名称必须',
'name.max' => '名称最多不能超过25个字符',
'email.require'=> '邮箱必须',
'email.email' => '邮箱格式错误',
];
// 4. 执行验证
$validate = Validate::rule($rule)->message($msg);
if (!$validate->check($data)) {
// 验证失败,输出错误信息
return $validate->getError();
}
// 5. 验证通过,处理业务逻辑(如保存到数据库)
// ...
return '提交成功!';
}
}
实战:一个简单的留言板
让我们综合运用以上知识,创建一个简单的留言板。
步骤 1:创建数据表 在你的数据库中执行以下 SQL:
CREATE TABLE `tp_message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` varchar(255) NOT NULL COMMENT '留言内容', `create_time` int(11) NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
步骤 2:创建模型
在 app/model 目录下创建 Message.php:
<?php
namespace app\model;
use think\Model;
class Message extends Model
{
protected $name = 'message'; // 指定表名
}
步骤 3:创建控制器
在 app/controller 目录下创建 Message.php:
<?php
namespace app\controller;
use think\Request;
use app\model\Message;
class Message
{
// 显示留言列表
public function index()
{
$list = Message::order('id', 'desc')->select();
return view('message/index', ['list' => $list]);
}
// 显示添加留言页面
public function add()
{
return view('message/add');
}
// 处理添加留言
public function save(Request $request)
{
$data = $request->post();
$data['create_time'] = time();
$message = new Message;
$result = $message->save($data);
if ($result) {
return '添加成功!<a href="/message/index">返回列表</a>';
} else {
return '添加失败!';
}
}
}
步骤 4:创建视图
- 创建
app/view/message目录。 - 在
message目录下创建index.html:<!DOCTYPE html> <html> <head> <title>留言板</title> <style>body { font-family: sans-serif; } .list-item { border: 1px solid #ccc; padding: 10px; margin-bottom: 10px; }</style> </head> <body> <h1>留言列表</h1> <a href="{:url('message/add')}">我要留言</a> <hr> {volist name="list" id="msg"} <div class="list-item"> <p>{$msg.content}</p> <small>发布时间:{:date('Y-m-d H:i:s', $msg.create_time)}</small> </div> {/volist} </body> </html> - 在
message目录下创建add.html:<!DOCTYPE html> <html> <head> <title>添加留言</title> </head> <body> <h1>添加留言</h1> <form action="{:url('message/save')}" method="post"> <p>留言内容:<textarea name="content" rows="5" cols="30"></textarea></p> <p><input type="submit" value="提交"></p> </form> </body> </html>
步骤 5:配置路由
编辑 route/app.php:
// ... 其他路由
Route::get('message', 'Message/index');
Route::get('message/add', 'Message/add');
Route::post('message/save', 'Message/save');
步骤 6:访问测试
启动你的 Web 服务器,访问 http://localhost/你的项目名/index.php/message,你就可以看到留言板界面了!
总结与进阶
恭喜!你已经完成了 ThinkPHP 5.1 的入门教程,掌握了开发一个简单 Web 应用的基本流程。
进阶学习方向:
- 中间件:用于处理请求前和响应后的逻辑,如用户认证、权限控制。
- 关联模型:学习
hasOne,belongsTo,hasMany等,处理复杂的数据表关系。 - 事件系统:在特定的时间点(如模型创建前)触发自定义逻辑。
- 缓存:使用
Cache类提升应用性能。 - 命令行工具:使用
think命令行工具完成更多任务,如生成代码、管理缓存等。 - 阅读官方文档:ThinkPHP 5.1 完全开发手册 是你最好的老师。
ThinkPHP 社区非常活跃,遇到问题时,多查阅文档、搜索社区,你一定能找到解决方案,祝你学习愉快!
