Class not found 错误本质是自动加载失败,主因是路径、命名空间、大小写、composer autoload 配置或 runtime 缓存不匹配;需依次检查文件存在性、namespace 声明、PSR-4 映射、vendor/autoload.php 引入及 runtime 目录清理。

Class not found 不是类没写,是自动加载机制压根没找对路。 ThinkPHP 6+ 完全依赖 Composer 的 PSR-4 映射,不是靠框架自己扫描文件。路径、命名空间、大小写、autoload 配置、缓存,任一环节错位都会直接报错,且不提示具体哪错了。
Class "appcontrollerIndex" not found 怎么快速定位
这是最典型的路径与命名空间错位表现,尤其在复制代码或跨平台迁移后高频出现。
- 检查文件是否真实存在于
app/controller/Index.php(注意:Linux 下index.php≠Index.php) - 打开该文件,确认顶部声明为
namespace appcontroller;,不能是Appcontroller、appcontroller(多一个反斜杠)、或漏掉app - 确认类名为
class Index,不是class index或class IndexController(除非你改了路由规则) - 运行
composer dump-autoload -v,看终端输出里是否扫描到了app/目录;再检查vendor/composer/autoload_psr4.php中"app\"是否映射到__DIR__ . '/../app/'
自定义类(如 app/utils/ArrHelper)无法 new 怎么配
ThinkPHP 6+ 不认 Loader::addNamespace(),必须走 Composer 的 PSR-4 注册。
- 在
composer.json的"autoload"→"psr-4"下加一行:"app\utils\": "app/utils/"(注意双反斜杠和末尾斜杠都必须存在) - 确保目录结构是
app/utils/ArrHelper.php,且该文件顶部写namespace apputils; - 执行
composer dump-autoload -o(加-o是关键,否则开发时可能不生效) - 别把类放
extend/下就以为能自动加载——除非你在composer.json里显式配置了"extend\": "extend/"
vendor 里的包(如 overtrue/pinyin)报 Class not found
这不是 TP 的问题,是 Composer 加载链断了。TP6 全程不碰 vendor 自动加载,只靠 vendor/autoload.php。
立即学习“PHP免费学习笔记(深入)”;
- 确认
public/index.php开头确实引入了require __DIR__ . '/../vendor/autoload.php'; - 运行
composer show overtrue/pinyin,看实际安装的版本——高版本可能已废弃OvertruePinyinPinyin,改用OvertruePinyinGenerator - 检查该包的
composer.json是否声明了 PSR-4;如果它用的是classmap,必须composer dump-autoload -o才能生效 - 别在
autoload.files里注册了 helper.php 这类函数文件,又让 TP 通过Loader::import()再加载一次,会触发Cannot redeclare function
最容易被忽略的是 runtime 缓存:哪怕 composer dump-autoload -o 成功了,runtime/container/ 和 runtime/cache/ 里仍可能存着旧的类映射,导致新类永远找不到。清空 runtime/ 整个目录比重启 PHP-FPM 更有效。



















