ThinkPHP 6+自动加载由Composer PSR-4接管,需路径、命名空间、文件名三者严格对齐,并执行composer dump-autoload -o;否则报Class not found。

ThinkPHP 6+ 的自动加载不是靠框架自己写一堆 __autoload 或手动 require 实现的,它完全交由 Composer 的 PSR-4 加载器接管。只要路径、命名空间、文件名三者严格对齐,且执行过 composer dump-autoload -o,类就能被找到;否则必报 Class "xxx" not found。
Class "appcontrollerIndex" not found 是路径和命名空间没对齐
这是 TP6 最常见的自动加载失败现象,本质是 PSR-4 规则不满足:
- 控制器类必须放在
app/controller/目录下,文件名必须是Index.php(首字母大写,后缀为.php,不是.class.php) - 类顶部必须声明
namespace appcontroller;(注意是反斜杠,且大小写完全一致:app不是App,controller不是Controller) - 类名必须与文件名一致:
class Index,不能是class index或class IndexController - 如果目录是
app/Controller/(大写 C),那命名空间就必须是appController,否则加载器找不到
自定义工具类(如 app/utils/ArrHelper)怎么让 TP6 自动加载
不能靠 Loader::addNamespace()(TP6 已废弃),必须走 Composer 配置:
- 在
composer.json的"autoload"→"psr-4"下添加映射:"app\utils\": "app/utils/"(注意双反斜杠转义,路径末尾带斜杠) - 确保
app/utils/ArrHelper.php文件里有namespace apputils;和class ArrHelper - 执行
composer dump-autoload -o(加-o才生成优化映射,开发环境漏掉这步常导致“改了却没生效”) - 使用时直接
new apputilsArrHelper(),不要加use也能工作,但建议加上以提高可读性
extend/ 目录下的类为什么总加载失败
extend/ 默认不在 Composer 的 PSR-4 自动扫描范围内,TP6 不再为它做特殊兼容:
立即学习“PHP免费学习笔记(深入)”;
- 要么把类移到
app/下并按 PSR-4 配置 autoload - 要么在
composer.json中显式加入:"app\extend\": "extend/",然后同样执行composer dump-autoload -o - 或者退一步,用
require_once手动引入(仅限临时调试,上线前必须改掉) - 注意:
import()函数在 TP5.1+ 已移除,TP6 完全不可用
vendor 第三方包加载失败,别怪 ThinkPHP
TP6 对 vendor/ 的加载完全零干预,全靠 Composer 的 vendor/autoload.php:
- 确认
public/index.php开头是否包含require __DIR__.'/../vendor/autoload.php';(TP6 默认有,但如果你重写过入口文件,可能删掉了) - 运行
composer show overtrue/pinyin看实际安装的版本,某些 v5+ 版本已将类从OvertruePinyinPinyin改为OvertruePinyinGenerator - 有些老包用的是
classmap而非 PSR-4,必须加-o参数才能生效:composer dump-autoload -o
最易被忽略的一点:所有路径和命名空间的大小写必须逐字匹配,Linux 服务器上 AppController 和 appcontroller 是两个完全不同的命名空间,Windows 开发机不报错不代表线上能跑通。



















