类找不到是因为未配置psr-4自动加载——需在composer.json中添加"apputils": "app/utils/"并执行composer dump-autoload -o,且文件需声明namespace apputils;。

类找不到?不是代码写错了,而是自动加载没配对——ThinkPHP 5.1 不会自动扫描你放的工具类,必须显式注册 PSR-4 或手动 require_once。
自定义工具类必须走 PSR-4 注册,否则 autoload 无视它
你在 app/utils/ArrHelper.php 写了个工具类,命名空间是 apputils,但控制器里 new ArrHelper() 报错 Class not found?这不是框架 bug,是 Composer 根本不知道这个目录该映射到哪个命名空间。
- 打开项目根目录的
composer.json,在"autoload"→"psr-4"下添加:"app\utils\": "app/utils/"
- 执行
composer dump-autoload -o(加-o是为了生成优化后的类映射) - 确保
ArrHelper.php文件顶部有正确的命名空间声明:namespace apputils;
- 注意反斜杠是双写
\,Windows 路径分隔符不适用;路径末尾带斜杠,且必须和实际目录名大小写完全一致
第三方 SDK(如 PHPExcel)不能直接放 vendor,得手动引入
ThinkPHP 5.1 已废弃 Loader::import() 和 vendor() 辅助函数,vendor/phpoffice/phpexcel 这类包即使存在,也不会被自动加载——除非它本身支持 PSR-4 或已由 Composer 自动注册。
- 推荐做法:把非 Composer 管理的 SDK 放进
extend/目录(如extend/phpexcel/Classes/PHPExcel.php) - 在用到它的控制器或服务类中,显式
require_once EXTEND_PATH . 'phpexcel/Classes/PHPExcel.php'; -
EXTEND_PATH是 ThinkPHP 预定义常量,指向extend/目录,比硬写相对路径更安全 - 切勿在全局入口或配置文件里批量
require_once所有 extend 下的文件——类未使用时加载会拖慢性能,还可能触发重复定义错误
别信“自动发现”,TP5.1 的自动加载只认 composer.json 和 vendor
有些教程说“把类放 app/ 下就能用”,那是 TP3.x 的逻辑;TP5.1 启动流程中,thinkphp/library/think/Loader.php 早已退居二线,真正起作用的是 vendor/autoload.php 加载的 Composer 映射表。
- 删掉
vendor/后重新composer install,之前有效的自定义类会立刻失效——因为dump-autoload生成的映射文件也在 vendor 里 -
app/common.php是全局函数文件,适合放纯函数(如function my_helper() { ... }),但不能用来“注册类” - 如果只是临时测试,可用
include或require_once绝对路径加载单个文件,但上线前务必回归 PSR-4 方案——否则部署到不同环境时路径极易出错
最容易被忽略的是:PSR-4 注册后必须执行 composer dump-autoload -o,且每次改了 composer.json 或移动了类文件都得重跑。不运行这句命令,等于白配。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











