跳至内容
文章与学习资源

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 这个框架。

可以同时核实的资料

Laravel China 提供中文文档和社区讨论,可以确认这个社区的存在。要了解全中国开发者的熟悉程度,还需要另外的数据。

访问 Laravel China ↗

先了解团队实际的项目、工具和工作语言,再决定接下来应当学习哪一种框架知识。

03 / TOOLBOX

经常会用到的六类工具

01

路由

路由把 HTTP 方法和 URL 规则连接到应用代码。明确声明路由,有助于找到接口入口、进行代码审查和编写测试,而不用猜测哪个文件负责处理请求。

02

控制器

控制器负责协调请求过程:读取已验证的输入,调用应用逻辑,再返回响应。让它保持清晰的职责,有助于后来接手的开发者理解一次修改会影响什么。

03

数据与模型

ThinkORM 提供查询和模型等数据库能力。模型可以组织数据行为,复杂的业务规则也可以放在独立服务中。一个简单的问候接口不需要数据库,更不需要为了使用 ORM 而额外创建数据表。

04

中间件

中间件在请求处理前后执行共享逻辑,适合放置身份认证、请求日志等横跨多个接口的工作。这样就不必在每个控制器里复制同一套检查代码。

05

验证

验证描述一个操作允许接受哪些输入,包括必填值、格式与长度。验证应当在业务处理之前完成;但输入符合格式,并不代表当前用户就有权限执行操作。

06

Composer 与扩展

Composer 管理 PHP 依赖。模板、队列和其他集成可能需要额外的软件包。请以项目实际安装的组件为准,不要默认所有功能都包含在框架核心中。

04 / REQUEST → RESPONSE

一步一步,跟随一个请求

输入一个容易辨认的名字,再查看问候接口的每个处理阶段。重点是分清职责,而不只是记住一段看起来能运行的代码。

GET /hello/Julio

路由

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 版本。

  1. 创建独立项目

    使用 Composer 安装官方项目,进入目录,并把开发服务器绑定到 localhost。这只是本地练习;开发服务器不应作为生产服务直接暴露到互联网。

    Terminal
    composer create-project topthink/think thinkphp-demo
    cd thinkphp-demo
    php think run --host 127.0.0.1 --port 8000
  2. 声明路由

    在刚创建的单应用学习项目中,用展示的代码替换 route/app.php 的示例内容。也可以只在已有 import 后添加路由语句;不要重复添加 PHP 起始标记或 use 声明。name 参数将传给 Learn/hello。

    route/app.php
    <?php
    
    use think\facade\Route;
    
    Route::get('hello/:name', 'Learn/hello');
  3. 添加控制器

    创建 app/controller/Learn.php,使用 app\controller 命名空间。方法根据收到的名字返回一个小型 JSON 对象。此示例不需要数据库凭据,也不需要额外的模板软件包。

    app/controller/Learn.php
    <?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 . '!',
            ]);
        }
    }
  4. 检查响应,再改动一处

    打开本地 hello 地址,换一个名字试试。把真实响应与模拟过程对照,认识涉及的文件,并用 composer audit 检查依赖。部署前还需要审查认证、验证、生产配置和 Web 服务器的文档根目录。

    Terminal
    curl http://127.0.0.1:8000/hello/Julio
    composer audit

06 / THINKPHP × LARAVEL

ThinkPHP 与 Laravel:把差异放进实际代码里看

选择一个主题,比较约定、项目默认行为,以及它们对同一项任务的影响。功能名称接近,代码并不一定可以直接互换。

ThinkPHP 8.xLaravel 13.x

比较范围:ThinkPHP 8.x 与 Laravel 13.x。扩展版本、starter kit 和项目配置会影响具体行为。

探索具体差异
01 / 12

它们能否使用相同的 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.xLaravel 13.x
Runtime / 许可证PHP ≥8.0 · Apache-2.0PHP ≥8.3 · MIT
路由文件route/app.phproutes/web.php;API 路由为可选项
路由参数hello/:name/hello/{name}
控制器位置app/controllerapp/Http/Controllers
数据库读取ThinkORM · select()查询构造器 / Eloquent · get()
必填规则requirerequired
验证失败响应明确 handler / JSON 契约JSON 请求通常返回 422
中间件配置app/middleware.phpbootstrap/app.php 与中间件组
HTML 模板ThinkView 驱动 + ThinkTemplateBlade;也可选择其他前端方式
队列 / 迁移兼容的生态扩展框架约定与 Artisan 命令
测试流程选择并配置项目测试套件文档化的 PHPUnit/Pest 与 HTTP helper
生产 Web rootpublic/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 版本,可以直接帮助你作出有用的修改。

  1. 阅读 composer.lock、路由配置、中间件与部署入口。
  2. 跟踪一个真实端点,从输入、数据访问一直看到响应。
  3. 修改端点或升级依赖前,先加入回归检查。

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

从原始资料继续学习

以官方项目、框架代码库和文档为技术参考。社区资料有助于理解使用背景;关于流行度的结论仍需要独立证据。