维护状态提示:ThinkPHP 主仓仍在持续发版,当前为 8.1.4(已兼容 PHP 8.5)。官方在 2026 年的规划里明确「保持稳定的发布节奏」,并会把 AI 辅助开发、think-orm 4.0 等能力下沉到框架层。8.x 属于「稳定且仍在演进」,不是「停止维护」。本文按当前状态来写,同时标出需要注意的地方。
定位
国内中小项目的主力框架。中文文档完整、目录结构符合国内开发者习惯、上手快。外包项目、政企项目、需要快速交付的场景里出场率极高。
安装
composer create-project topthink/think tp-demo
cd tp-demo
php think run # 内置服务器,默认 8000 端口
目录结构
tp-demo/
├── app/
│ ├── controller/ # 控制器
│ ├── model/ # 模型
│ ├── middleware.php # 中间件注册
│ └── common.php # 公共函数
├── config/ # 配置(app/database/route/cache...)
├── public/index.php # 入口
├── route/app.php # 路由定义
└── think # 命令行入口
和 Laravel 对比:ThinkPHP 的 app 目录在根下(Laravel 也是),但没有 routes/ 目录(路由在 route/),配置文件是纯 PHP 数组(Laravel 也是),没有 Artisan(用 php think)。
最小示例
控制器
// app/controller/User.php
namespace app\controller;
use app\model\User as UserModel;
use think\facade\Request;
class User
{
public function index()
{
return json(UserModel::select());
}
public function read($id)
{
$user = UserModel::find($id);
if (!$user) {
return json(['msg' => 'not found'], 404);
}
return json($user);
}
public function save()
{
$data = Request::only(['name', 'email']);
$user = UserModel::create($data);
return json($user, 201);
}
}
路由
// route/app.php
use think\facade\Route;
Route::get('users', 'User/index');
Route::get('users/:id', 'User/read');
Route::post('users', 'User/save');
// 资源路由(一次生成 7 个 RESTful 接口)
Route::resource('articles', 'Article');
模型
// app/model/User.php
namespace app\model;
use think\Model;
class User extends Model
{
protected $autoWriteTimestamp = true; // 自动写入 create_time / update_time
// 关联
public function articles()
{
return $this->hasMany(Article::class);
}
// 访问器:读取时自动处理
public function getNameAttr($value)
{
return trim($value);
}
}
核心概念
1. 门面(Facade)无处不在
think\facade\Db、Request、Cache、Session、Config、Log 都是静态调用,但底层是真实对象。写法简洁,代价是不好 mock(测试时)。
2. 数据库查询构造器
// 查询构造器(类似 Laravel 的 DB facade)
Db::table('user')->where('status', 1)->order('id', 'desc')->paginate(20);
// 模型查询
User::where('status', 1)->with(['articles'])->select();
写法接近 Laravel,但两处对应关系容易搞混:指定查询字段用 field()(对应 Laravel 的 select());执行查询取结果集用 select()(对应 Laravel 的 get())——同名的 select() 在两边语义不同。
3. 中间件
// app/middleware/Auth.php
namespace app\middleware;
class Auth
{
public function handle($request, \Closure $next)
{
if (!$request->header('Authorization')) {
return json(['msg' => 'unauthorized'], 401);
}
return $next($request);
}
}
注册在 app/middleware.php(全局)或路由上(局部)。
需要注意的地方
① PHP 新版本的兼容性风险
ThinkPHP 8.1.x 对新 PHP 版本是跟进的(8.1.4 已声明兼容 PHP 8.5),但节奏通常滞后于 PHP 发布。升级 PHP 大版本前,先看官方兼容说明并全量测试。
② 第三方包依赖旧组件
ThinkPHP 用了部分 Symfony 组件,并通过版本约束把它们锁在验证过的范围内——真正的风险不是「冲突没人修」,而是随手 composer update 拉到框架没验证过的新组件组合。
建议:锁定 composer.lock,不要随意 composer update。
③ 安全补丁的响应速度
历史响应正常,且 8.1.x 目前仍在持续发版。重要项目建议盯住官方仓库的安全 issue 与 changelog,发版后及时跟进。
什么时候选它
- 国内中小项目、快速交付
- 团队已经熟悉
- 维护期预期不超过 3 年
为什么依然推荐:中小项目的核心矛盾是「交付周期」,不是「技术先进性」。ThinkPHP 在这件事上的效率优势真实存在,存量项目、招聘需求、教程资源也都在。
不选它的场景:需要长期演进(5 年以上)、需要紧跟 PHP 新版本、团队愿意投入学习 Laravel。
和 Laravel 的取舍
| ThinkPHP 8 | Laravel 13 | |
|---|---|---|
| 上手速度 | 快 | 中 |
| 中文文档 | 完整 | 翻译较多 |
| 生态规模 | 中小 | 极大 |
| 更新活跃度 | 稳定迭代(8.1.x 持续发版) | 活跃 |
| 适合项目 | 交付导向 | 长期维护 |
延伸阅读
- PHP 生态与框架选型——先看全景再定框架,本文是其中一个选项的深读
- Laravel 框架入门——长期维护项目的另一条主线
- Symfony 组件与架构——很多底层组件的出处,理解生态必读