PSR-4自动加载需严格配置autoload顶层字段,命名空间以双反斜杠结尾如"App",路径为相对composer.json的子目录如"src/",修改后必须执行composer dump-autoload更新autoload_psr4.php。

composer.json 里 autoload 怎么写才管用
PSR-4 不是“配完就跑”,它只认你手动写进 composer.json 的那一行映射,而且必须严格满足格式。写错一个反斜杠、多一个点、少一个斜杠,new AppUser() 就会报 Class 'AppUser' not found。
-
"autoload"必须是顶层字段,不能嵌在extra或其他键下面 - 命名空间键必须以双反斜杠结尾:
"App"✅,"App"❌(PHP 里单个是转义符) - 路径值是相对于
composer.json所在目录的子路径,不支持../,也不接受./src/或绝对路径 - 路径末尾加不加
/都可以,但推荐统一写成"src/",避免某些 Composer 版本警告
正确示例:
{
"autoload": {
"psr-4": {
"App": "src/",
"Tests": "tests/"
}
}
}
为什么 dump-autoload 是必跑命令,不是可选项
Composer 不会在每次 require 'vendor/autoload.php' 时重新读取 composer.json。它把所有 PSR-4 映射编译进了 vendor/composer/autoload_psr4.php —— 这个文件才是运行时真正被加载的“快照”。改了配置却不跑命令,等于没改。
- 执行
composer dump-autoload才会重写autoload_psr4.php - 开发中加
-o(即composer dump-autoload -o)会生成优化版映射表,跳过运行时拼路径,加载更快 -
composer install或update会顺带触发一次 dump,但不保证读的是你最新改的配置——别依赖它 - 如果刚加了一个
"Utils": "lib/utils/",但class_exists('UtilsHelper')还是 false,第一反应就是:跑没跑 dump?
类找不到?90% 是路径和命名空间没对齐
PSR-4 不扫描目录,它只做确定性拼接:给定 AppHttpControllersHomeController,就去 src/Http/Controllers/HomeController.php 找。差一层目录、错一个大小写、文件名多下划线,全挂。
- 命名空间层级 = 目录层级:
"App" → "src/",那么AppModelsUser必须对应src/Models/User.php,不能是src/User.php或src/models/user.php - 文件名必须和最末级类名完全一致,大小写敏感:
class ApiResponse→ 必须叫ApiResponse.php,apiresponse.php在 Linux 上直接 404 - 命名空间声明要完整且无多余字符:
namespace AppModels;✅,namespace AppModels;❌(除非你配了"App\Models\": "src/Models/") - Windows 下开发也建议严格大小写一致,否则上线到 Linux 服务器立刻崩
测试类、本地 SDK、临时工具怎么加进来
别往主 autoload 里硬塞,也别手动改 vendor/autoload.php —— 那些文件下次 composer install 就被覆盖。
- 测试类走
autoload-dev:"autoload-dev": {"psr-4": {"Tests": "tests/"}},这样composer install --no-dev就不会加载它们 - 本地未打包的 SDK,用
repositories+require引入路径或 Git 仓库,比硬配路径更可持续 - 纯函数库(比如一堆
helper_*.php),用"files"数组直接列出来:"files": ["src/helpers.php"] - 开发调试阶段想快速加载扁平目录?可以用
"classmap"扫描整个src/,但生产环境慎用——它会把所有 PHP 文件注册进 autoloader,哪怕根本没调用
最常被忽略的一点:路径必须真实存在。配了 "App": "src/",但项目里压根没有 src/ 目录,dump-autoload 不报错,运行时才爆雷。










