autoload.php 在 require 'vendor/autoload.php' 时注册 Composer 自动加载器,其映射规则来自 vendor/composer/autoload_*.php;必须在任何类引用前引入,PSR-4 配置需严格匹配命名空间、路径与文件名,大小写和斜杠均敏感,改配置或文件后须执行 composer dump-autoload 更新映射。

autoload.php 是怎么被“激活”的?
你写 require 'vendor/autoload.php' 的那一刻,PHP 就注册了一个自动加载器——它不干别的,只等你用 new、class_exists() 或 use 触发类加载时才出手。这个加载器是 Composer\Autoload\ClassLoader 实例,它的映射规则全来自 vendor/composer/autoload_psr4.php 等生成文件,不是实时解析代码。
常见错误现象:Class not found 却确认类文件存在 → 很可能根本没 require vendor/autoload.php,或把它放在了类使用之后。
- 必须在任何类被引用前
require它,顺序不能错 - 它只是入口,真正干活的是
autoload_real.php和一堆映射数组文件 - 不引入它,PSR-4 配置再对也完全不生效
psr-4 配置写错一个字符就失效
PSR-4 不是“大概能对上”,它是机械字符串替换:把类名前缀砍掉,剩下的部分把 \ 换成 /,再拼到目录路径后——中间任何一个环节大小写/斜杠/命名空间结尾漏 \,就直接失败。
正确配置示例(项目根目录下有 src/Controller/UserController.php):
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
-
"App\\"必须双反斜杠:JSON 中\是转义符,单写"App\"会报语法错 -
"src/"不能写成"src"或"/src/"—— 结尾斜杠必须有,且不能以/开头 - 类文件必须严格叫
UserController.php,不能是usercontroller.php(Linux 下直接挂) - 文件里必须写
namespace App\Controller;,不能多空格、不能少;、不能有 BOM
dump-autoload 不是“刷新缓存”,而是重生成映射表
改完 composer.json 的 autoload 配置,或新增/移动了类文件,composer dump-autoload 才会重新扫描并写入 vendor/composer/autoload_*.php。它不下载包、不检查语法、也不验证类是否真能实例化。
- 日常开发中,只改类文件不改配置,不用跑它;但改了
psr-4映射或加了classmap目录,必须执行 - 加
-o参数(即composer dump-autoload -o)会启用autoload_static.php,把映射固化为静态数组,跳过运行时拼接,性能更好,但要求所有类都在扫描范围内 - 加
--classmap-authoritative后,加载器彻底忽略动态查找,只信autoload_classmap.php—— 生产环境提速明显,但漏扫一个类就Fatal error
files 和 classmap 该怎么选?
files 和 classmap 解决的是 PSR-4 不覆盖的场景:files 是无条件预加载,classmap 是按需加载老代码——它们互不替代,也别混用。
比如你想让全局函数 str_slug() 随处可用,就该配 files:
{
"autoload": {
"files": ["src/helpers.php"]
}
}
而 legacy 目录下有一堆 class DBUtil、class CacheHelper,没命名空间、文件名乱七八糟,就该用 classmap:
{
"autoload": {
"classmap": ["legacy/"]
}
}
-
files列表里的每个 PHP 文件,只要require 'vendor/autoload.php'就立刻执行一次,适合函数/常量/ini_set;不能放类定义(会重复定义) -
classmap扫描时靠正则匹配class、interface、trait关键字,不解析 AST,所以不支持 PHP 8.2 的只读类等新语法声明(会漏) - 两者都必须运行
composer dump-autoload才生效,且路径都是相对于composer.json的
最常被忽略的一点:PSR-4 映射和 classmap 可以共存,Composer 会按顺序依次尝试;但一旦 classmap 里有同名类,它就会优先加载 classmap 版本——哪怕你本意是想走 PSR-4 调试。










