PHP 框架入门:ThinkPHP 基础教程(2026实战)
引言
ThinkPHP 是国内最流行的 PHP 框架之一,2006年发布至今已有近20年历史。它以简单、开源、中文文档完善著称,是国内 Web 开发入门首选框架。
一、ThinkPHP 版本选择
目前主流版本:
- <strong>ThinkPHP 5.1</strong>(LTS,维护到2024年,稳定成熟)
- <strong>ThinkPHP 6.0</strong>(最新,PHP 7.2+,现代架构)
- <strong>ThinkPHP 8.0</strong>(2024年发布,PHP 8.1+,性能大幅提升)
初学者推荐从 ThinkPHP 6.0 开始,5.1 和 6.0 核心用法差异不大,迁移成本低。
二、安装与项目创建
方式一:Composer 创建(推荐)
composer create-project topthink/think myapp
cd myapp
方式二:手动下载
去官网 thinkphp.cn 下载压缩包,解压到网站目录即可。
目录结构
myapp/
├── app/ # 应用核心目录
│ ├── controller/ # 控制器
│ ├── model/ # 模型
│ └── view/ # 视图
├── config/ # 配置文件
├── route/ # 路由配置
├── public/ # 公开访问目录(入口文件在这里)
├── runtime/ # 运行时目录(日志、缓存)
└── composer.json # 依赖管理
三、入口文件与运行
ThinkPHP 通过 public/index.php 作为单一入口:
// public/index.php
define('APP_PATH', __DIR__ . '/../app/');
require __DIR__ . '/../vendor/autoload.php';
(new think\App())->run();
启动开发服务器:
cd myapp
php think run
# 输出:You can visit http://127.0.0.1:8000
四、路由与控制器
定义路由
编辑 route/app.php:
use think\facade\Route;
Route::get('/', function(){
return '欢迎访问 ThinkPHP!';
});
Route::get('/hello/:name', 'index/hello');
Route::post('/save', 'index/save');
路由规则:
- <code>:name</code> 是动态参数
- 默认访问 <code>app/controller/Index.php</code> 的 <code>hello</code> 方法
创建控制器
php think make:controller index
编辑 app/controller/Index.php:
<?php
namespace app\controller;
use app\BaseController;
class Index extends BaseController
{
public function index()
{
return view('index', ['title' => '首页']);
}
public function hello($name = 'World')
{
return json([
'code' => 0,
'message' => "你好,{$name}!"
]);
}
}
五、数据库操作
配置数据库
编辑 config/database.php:
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'myapp',
'username' => 'root',
'password' => '',
'hostport' => '3306',
'charset' => 'utf8mb4',
],
],
];
模型定义
php think make:model User
编辑 app/model/User.php:
<?php
namespace app\model;
use think\Model;
class User extends Model
{
// 指定表名(默认取类名小写)
protected $name = 'users';
// 自动时间戳
protected $autoWriteTimestamp = true;
// 只允许写入的字段
protected $fillable = ['username', 'email', 'password'];
}
增删改查
// 插入数据
$user = User::create([
'username' => 'admin',
'email' => 'admin@example.com',
'password' => password_hash('123456', PASSWORD_DEFAULT),
]);
echo $user->id; // 获取自增ID
// 查询数据
$user = User::find(1);
echo $user->username;
// 条件查询
$users = User::where('status', 1)
->order('id', 'desc')
->limit(10)
->select();
// 更新数据
$user = User::find(1);
$user->email = 'new@example.com';
$user->save();
// 删除数据
$user->delete();
六、视图与模板
创建视图
创建 app/view/index/hello.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{$title|default='首页'}</title>
</head>
<body>
<h1>欢迎,{$name|default='游客'}!</h1>
<table border="1" cellpadding="8" cellspacing="0">
<tr><th>ID</th><th>用户名</th><th>邮箱</th></tr>
{volist name="users" id="user"}
<tr>
<td>{$user.id}</td>
<td>{$user.username}</td>
<td>{$user.email}</td>
</tr>
{/volist}
</table>
<p>当前时间:{$time|date='Y-m-d H:i:s'}</p>
</body>
</html>
控制器返回视图
public function index()
{
$users = User::where('status', 1)->select();
return view('index', [
'title' => '用户列表',
'name' => '小飞兽',
'users' => $users,
'time' => time(),
]);
}
模板语法
<!-- 变量输出 -->
{$name}
{$user.email}
{$data|default='默认值'}
<!-- 条件判断 -->
{if $score >= 60}
<span style="color:green">及格</span>
{else /}
<span style="color:red">不及格</span>
{/if}
<!-- 循环 -->
{foreach $list as $item}
<p>{$item.name}</p>
{/foreach}
<!-- 原样输出(不过滤HTML) -->
{$htmlContent|raw}
七、中间件
中间件用于在请求处理前后执行拦截逻辑,比如登录验证、CORS、请求日志等。
创建中间件
php think make:middleware CheckLogin
编辑 app/middleware/CheckLogin.php:
<?php
namespace app\middleware;
class CheckLogin
{
public function handle($request, \Closure $next)
{
// 前置逻辑:检查是否登录
if (!$request->session('?user_id')) {
return redirect('/login');
}
// 执行后续逻辑
return $next($request);
}
}
注册中间件
编辑 app/middleware.php:
return [
'check' => \app\middleware\CheckLogin::class,
];
路由使用:
Route::get('/profile', 'user/profile')->middleware('check');
八、常见问题
Q1:访问报"No input file specified"?
这是 Nginx 配置问题,确认 public/index.php 路径正确,Nginx 配置:
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
Q2:session 一直失效?
检查 .env 文件:
SESSION_DRIVER=file
SESSION_EXPIRE=3600
同时确保 runtime/session/ 目录存在且可写。
Q3:验证码不显示?
需要开启 PHP GD 扩展:
# 检查扩展
php -m | grep gd
# Ubuntu 安装
sudo apt install php-gd
sudo systemctl reload php-fpm
Q4:数据库连接失败?
确认 MySQL 服务在运行,端口正确(默认3306),用户名密码匹配。
# 测试 MySQL 连接
mysql -u root -p -h 127.0.0.1
九、运行效果
启动后访问 http://127.0.0.1:8000/hello/tp,返回:
{"code":0,"message":"你好,tp!"}
访问 http://127.0.0.1:8000/,显示用户列表页面。
十、总结
ThinkPHP 上手只需五步:
| 步骤 | 内容 | 关键命令 |
|------|------|---------|
| 安装 | Composer 创建项目 | composer create-project topthink/think |
| 配置 | 修改 database.php | 数据库连接信息 |
| 路由 | 定义 URL 规则 | route/app.php |
| 控制器 | 处理业务逻辑 | php think make:controller |
| 模型 | 数据库操作 | php think make:model |
ThinkPHP 中文文档完善,社区活跃,遇到问题搜索中文资料基本都能解决,是国内 PHP 开发者入门的最佳选择。