维护状态提示:ThinkPHP 主仓最后一次版本发布是 2025-07-16(8.1.3),最后一次提交同月。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 appcontroller;
use appmodelUser as UserModel;
use thinkfacadeRequest;
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 thinkfacadeRoute;
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 appmodel;
use thinkModel;
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)无处不在
thinkfacadeDb、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,但方法的参数顺序有差异(比如 where('字段', '操作符', '值') 和 Laravel 一致,但 field() 对应 Laravel 的 select())。
3. 中间件
// app/middleware/Auth.php
namespace appmiddleware;
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 支持到 PHP 8.x,但后续 PHP 大版本(8.4、9.0)发布后,框架不会主动跟进。部署新 PHP 版本前必须先测。
② 第三方包依赖旧组件
ThinkPHP 用了部分 Symfony 组件。那些组件会持续升级,如果你的 composer.lock 被更新,可能出现版本冲突而框架不修。
建议:锁定 composer.lock,不要随意 composer update。
③ 安全补丁的响应速度
历史响应正常,但长期看这是所有停止活跃维护的项目共同的风险。重要项目建议关注官方仓库的安全 issue。
什么时候选它
- 国内中小项目、快速交付
- 团队已经熟悉
- 维护期预期不超过 3 年
为什么依然推荐:中小项目的核心矛盾是「交付周期」,不是「技术先进性」。ThinkPHP 在这件事上的效率优势真实存在,存量项目、招聘需求、教程资源也都在。
不选它的场景:需要长期演进(5 年以上)、需要紧跟 PHP 新版本、团队愿意投入学习 Laravel。
和 Laravel 的取舍
| ThinkPHP 8 | Laravel 13 | |
|---|---|---|
| 上手速度 | 快 | 中 |
| 中文文档 | 完整 | 翻译较多 |
| 生态规模 | 中小 | 极大 |
| 更新活跃度 | 已放缓 | 活跃 |
| 适合项目 | 交付导向 | 长期维护 |