PHP × 中文开发者生态
ThinkPHP 是什么?认识中文 PHP 开发生态
如果一位中国同事还不了解 Laravel,会引出怎样的问题?从我的亲身交流出发,通过相同的请求、数据库查询与项目需求,深入比较 ThinkPHP 和 Laravel。
01 / PHP FRAMEWORK
框架为 PHP 应用提供清晰的结构
ThinkPHP 是 TOPThink 生态中的开源 PHP Web 框架,采用 Apache 2.0 许可证。它提供处理 HTTP 请求、组织应用代码和生成响应所需的约定与工具。开发者可以在已有结构上实现业务,而不必为每个页面重新拼装所有基础功能。
它运行在服务端,与 Laravel 属于同一类工具。Vue 负责浏览器中的界面,ThinkPHP 可以提供供界面调用的 JSON API。
- 服务端框架
- PHP + Composer
- HTML 页面或 JSON API
02 / 来自我的一次亲身经历
我向一位中国同事问起 Laravel,对方还不了解它。
这是我与一位共事者直接交流时的真实经历。技术圈之间的差异因此变得具体:在一个工作环境里熟悉的框架,在另一个环境里可能还没有接触过。
我的实际经历
我询问的这位中国同事,当时还不了解 Laravel 这个框架。
先了解团队实际的项目、工具和工作语言,再决定接下来应当学习哪一种框架知识。
03 / TOOLBOX
经常会用到的六类工具
路由
路由把 HTTP 方法和 URL 规则连接到应用代码。明确声明路由,有助于找到接口入口、进行代码审查和编写测试,而不用猜测哪个文件负责处理请求。
控制器
控制器负责协调请求过程:读取已验证的输入,调用应用逻辑,再返回响应。让它保持清晰的职责,有助于后来接手的开发者理解一次修改会影响什么。
数据与模型
ThinkORM 提供查询和模型等数据库能力。模型可以组织数据行为,复杂的业务规则也可以放在独立服务中。一个简单的问候接口不需要数据库,更不需要为了使用 ORM 而额外创建数据表。
中间件
中间件在请求处理前后执行共享逻辑,适合放置身份认证、请求日志等横跨多个接口的工作。这样就不必在每个控制器里复制同一套检查代码。
验证
验证描述一个操作允许接受哪些输入,包括必填值、格式与长度。验证应当在业务处理之前完成;但输入符合格式,并不代表当前用户就有权限执行操作。
Composer 与扩展
Composer 管理 PHP 依赖。模板、队列和其他集成可能需要额外的软件包。请以项目实际安装的组件为准,不要默认所有功能都包含在框架核心中。
04 / REQUEST → RESPONSE
一步一步,跟随一个请求
输入一个容易辨认的名字,再查看问候接口的每个处理阶段。重点是分清职责,而不只是记住一段看起来能运行的代码。
路由
URL 匹配 hello 路由。name 这一段会成为传给 Learn/hello 的参数;路由负责选择处理入口,而不是直接承担所有响应逻辑。
<?php
use think\facade\Route;
Route::get('hello/:name', 'Learn/hello');这是本地教学模拟,不会执行 PHP;名字不会发送到服务器,也不会被保存。
05 / FIRST ENDPOINT
做一个能够真正检查的小接口
请在独立的学习目录中实践。先得到一个能运行、也能解释清楚的路由和响应,再考虑数据库、登录流程或管理后台。
准备 Composer,以及仍受支持、同时满足依赖要求的 PHP 版本。ThinkPHP 8 项目要求 PHP 8.0 或更高版本,但最低运行要求并不等于建议使用已经停止支持的 PHP 版本。
创建独立项目
使用 Composer 安装官方项目,进入目录,并把开发服务器绑定到 localhost。这只是本地练习;开发服务器不应作为生产服务直接暴露到互联网。
composer create-project topthink/think thinkphp-demo cd thinkphp-demo php think run --host 127.0.0.1 --port 8000声明路由
在刚创建的单应用学习项目中,用展示的代码替换 route/app.php 的示例内容。也可以只在已有 import 后添加路由语句;不要重复添加 PHP 起始标记或 use 声明。name 参数将传给 Learn/hello。
<?php use think\facade\Route; Route::get('hello/:name', 'Learn/hello');添加控制器
创建 app/controller/Learn.php,使用 app\controller 命名空间。方法根据收到的名字返回一个小型 JSON 对象。此示例不需要数据库凭据,也不需要额外的模板软件包。
<?php namespace app\controller; use app\BaseController; use think\response\Json; class Learn extends BaseController { public function hello(string $name = 'World'): Json { return json([ 'framework' => 'ThinkPHP', 'name' => $name, 'message' => 'Hello, ' . $name . '!', ]); } }检查响应,再改动一处
打开本地 hello 地址,换一个名字试试。把真实响应与模拟过程对照,认识涉及的文件,并用 composer audit 检查依赖。部署前还需要审查认证、验证、生产配置和 Web 服务器的文档根目录。
curl http://127.0.0.1:8000/hello/Julio composer audit
06 / THINKPHP × LARAVEL
ThinkPHP 与 Laravel:把差异放进实际代码里看
选择一个主题,比较约定、项目默认行为,以及它们对同一项任务的影响。功能名称接近,代码并不一定可以直接互换。
比较范围:ThinkPHP 8.x 与 Laravel 13.x。扩展版本、starter kit 和项目配置会影响具体行为。
探索具体差异它们能否使用相同的 PHP 环境?
ThinkPHP 8.x
基于 Composer 的项目,最低要求 PHP 8.0。
- 应用骨架与框架核心是两个独立的包,版本号也可能不同。
- ThinkPHP 采用 Apache-2.0 许可证;扩展的许可证需分别查看。
Laravel 13.x
Laravel 13 要求 PHP 8.3 或更高版本。
- 安装选项可能加入前端工具、starter kit 和测试工具。
- Laravel 采用 MIT 许可证;其他依赖具有各自的许可条款。
对实际项目的影响
选择主机前检查 PHP 扩展与 lockfile。优先使用仍在维护、且兼容全部依赖的 PHP 版本。可以带到项目里的差异速查
阅读实际代码库时再打开这份参考。这里列的是需要检查的约定,不是决定通用赢家的评分。
| 方面 | ThinkPHP 8.x | Laravel 13.x |
|---|---|---|
| Runtime / 许可证 | PHP ≥8.0 · Apache-2.0 | PHP ≥8.3 · MIT |
| 路由文件 | route/app.php | routes/web.php;API 路由为可选项 |
| 路由参数 | hello/:name | /hello/{name} |
| 控制器位置 | app/controller | app/Http/Controllers |
| 数据库读取 | ThinkORM · select() | 查询构造器 / Eloquent · get() |
| 必填规则 | require | required |
| 验证失败响应 | 明确 handler / JSON 契约 | JSON 请求通常返回 422 |
| 中间件配置 | app/middleware.php | bootstrap/app.php 与中间件组 |
| HTML 模板 | ThinkView 驱动 + ThinkTemplate | Blade;也可选择其他前端方式 |
| 队列 / 迁移 | 兼容的生态扩展 | 框架约定与 Artisan 命令 |
| 测试流程 | 选择并配置项目测试套件 | 文档化的 PHPUnit/Pest 与 HTTP helper |
| 生产 Web root | public/ | public/ |
SAME TASK / TWO IMPLEMENTATIONS
同一项任务,两种表达方式
把等价的操作放在一起看,重点比较 import、路由规则、查询结束方法和错误处理,而不是单纯数代码行。
根据 URL 中的名字返回一条问候。
ThinkPHP:route/app.php。Laravel:routes/web.php。两边都使用路由闭包,便于比较相同结构。
ThinkPHP 8.x
route/app.php
<?php
use think\facade\Route;
Route::get('hello/:name', function (string $name) {
return json([
'name' => $name,
'message' => 'Hello, ' . $name . '!',
]);
});Laravel 13.x
routes/web.php
<?php
use Illuminate\Support\Facades\Route;
Route::get('/hello/{name}', function (string $name) {
return response()->json([
'name' => $name,
'message' => 'Hello, ' . $name . '!',
]);
});这些 GET 示例不需要数据库。已有路由文件可能已经包含 PHP 开始标记和 import。
CONTEXT / NOT A LEADERBOARD
根据自己的处境选择学习路线
选择最接近当前需求的情况,把比较变成一个可以动手的小计划。
从实际需要维护的应用开始
了解已安装的 ThinkPHP 版本,可以直接帮助你作出有用的修改。
- 阅读 composer.lock、路由配置、中间件与部署入口。
- 跟踪一个真实端点,从输入、数据访问一直看到响应。
- 修改端点或升级依赖前,先加入回归检查。
07 / YOUR NEXT MOVE
从眼前的工作选择学习路线
这些情况下,值得了解 ThinkPHP
- 需要维护现有 ThinkPHP 项目。先追踪一个真实功能,从路由看到控制器和响应,再考虑是否有必要调整架构。
- 与使用中文 PHP 资料的团队合作。先读一小节文档,再把陌生术语对应到能够运行的代码上。
- 已经熟悉 Laravel,希望认识另一套约定。重新实现一个简单的只读接口,比较两种项目如何组织相同职责。
这些基础能力仍然值得练习
- 掌握现代 PHP、Composer、HTTP 方法、响应状态码和错误处理。知道底层在做什么,才能判断框架的简化是否适合当前问题。
- 分别练习验证、授权和数据库查询。成功返回 JSON 只是起点,离一个可靠应用还需要明确规则与持续测试。
- 测试需要的行为,记录部署假设,并把依赖锁文件纳入版本管理。无论选择哪个框架,可重复安装都是重要的协作基础。
08 / 中文 × CODE
读文档时经常出现的六个中文术语
- 框架kuàng jià
- 应用建立在其上的结构、约定与基础工具。
- 路由lù yóu
- 把 URL 与 HTTP 方法连接到具体处理入口。
- 控制器kòng zhì qì
- 协调请求处理并返回响应的代码。
- 模型mó xíng
- 对数据行为的抽象,具体职责取决于应用设计。
- 中间件zhōng jiān jiàn
- 围绕请求处理执行的共享流程。
- 验证yàn zhèng
- 检查输入是否符合当前操作规定的规则。
09 / READY TO BUILD
上线之前,先检查这些事项
用这份学习清单发现下一项工作。全部勾选完成,也不能代替对实际应用的测试。
已检查 0/6 项
10 / FAQ
选择框架前值得弄清的问题
为什么我的中国同事还不了解 Laravel?
在本文描述的那次交流中,我的同事确实还不了解 Laravel。同时,Laravel China 也有中文文档与社区讨论。这些观察反映了不同的实际经历;接下来更有用的问题,是某个团队日常接触哪些工具与项目。
学习 ThinkPHP 就需要替换 Vue 吗?
不需要。ThinkPHP 在服务器上运行 PHP,Vue 用于构建界面。它们可以通过 HTTP API 配合,ThinkPHP 也可以输出服务端页面。本站仍然是 Vue 作品集。
每个请求都必须使用模型和模板吗?
不必。简单的 JSON 问候可以通过路由和控制器完成,不需要数据库或模板。模型、服务和呈现工具应当根据真实需求引入。
旧版 ThinkPHP 教程能直接复制到新项目吗?
先核对框架与软件包版本。不同大版本的目录结构、配置、扩展和 API 可能不同。优先阅读与已安装版本匹配的文档,再在本地验证示例。
11 / REFERENCES
从原始资料继续学习
以官方项目、框架代码库和文档为技术参考。社区资料有助于理解使用背景;关于流行度的结论仍需要独立证据。