ThinkPHP 5.0.22 不自动加载类或函数,必须显式配置 composer.json 的 PSR-4 或 files、执行 composer dump-autoload -o,并在入口文件中 require DIR . '/../vendor/autoload.php'。

ThinkPHP 5.0.22 不会自动加载你写的类或函数,必须靠 composer.json 显式声明 + composer dump-autoload 生效,且入口文件必须手动引入 vendor/autoload.php —— 少任何一环都会报 Class not found 或 Call to undefined function。
入口文件必须 require vendor/autoload.php
TP5.0.22 启动时不自动包含 Composer 加载器,它完全依赖你手写那一行:require __DIR__ . '/../vendor/autoload.php';。常见错误包括:
- 漏写这行,哪怕
composer install成功,new MonologLogger()也直接报错 - 路径写成
require 'vendor/autoload.php',但脚本不在项目根目录(比如 CLI 下执行php app/cli.php),导致路径失效 - 用
include替代require,失败时只警告不中断,调试时更难定位
自定义类要配 PSR-4 并 dump-autoload
想让 appcommonHelper 这类命名空间能被自动识别,不能只放对位置,必须在 composer.json 中注册:
{
"autoload": {
"psr-4": {
"app\": "app/"
}
}
}
注意点:
立即学习“PHP免费学习笔记(深入)”;
- 反斜杠要双写(
app\),否则 JSON 解析失败 - 路径是相对于
composer.json所在目录的,不是相对于入口文件 - 改完后必须运行
composer dump-autoload -o(-o表示优化,生成静态映射,TP5.0.22 兼容) - 如果类没命名空间,或用了
require_once 'app/common/Helper.php',那它压根不走 Composer 加载逻辑
全局函数要用 files 加载方式
TP5.0.22 不支持像 TP6 那样用 thinkacadeEnv 统一管理辅助函数,想加 helper.php 里的 str_slug(),得走 files 方式:
{
"autoload": {
"files": [
"app/functions/helper.php"
]
}
}
关键限制:
- 路径必须存在,且是 PHP 文件(不能是
.inc或带 BOM 的 UTF-8) - 文件里不能重复定义函数,否则运行时报
Fatal error: Cannot redeclare -
files总是比psr-4先加载,所以函数里不能直接 new 一个还没被 PSR-4 加载的类 - 测试时(如 PHPUnit)需确保 bootstrap 指向了
vendor/autoload.php,否则函数不可见
为什么 dump-autoload 后还是找不到类?
最常被忽略的是:TP5.0.22 的 hinkLoader::register() 会把 Composer 生成的映射(比如 vendor/composer/autoload_static.php)复制进自己的加载表,但它只读一次。所以:
- 你改了
composer.json却没dump-autoload,autoload_static.php没更新,Loader 就加载不到新类 - 你删了某个类文件但没重新
dump-autoload,旧映射还在,可能引发“文件不存在但类名能匹配”的诡异错误 - 第三方扩展(如
topthink/think-migration)若自身composer.json没配 autoload 字段,它里面的类也不会被 TP5.0.22 自动识别
遇到问题先确认三件事:入口文件有没有 require、composer.json 是否正确声明、vendor/composer/autoload_static.php 里有没有对应类名的映射行。



















