composer自动加载依赖映射表与spl_autoload_register回调;psr-4不支持中文路径,因路径拼接无编码转换,且autoload_psr4.php仅在dump-autoload时生成。

Composer 自动加载不是“自动猜路径”,而是靠你写死的映射表 + spl_autoload_register 回调共同生效;PSR-4 不支持中文路径,也不做任何编码转换,类文件路径必须是 UTF-8 编码的合法 PHP 文件系统路径。
PSR-4 映射表怎么生成、谁在读它
映射数据不在 vendor/autoload.php 里,而在 vendor/composer/autoload_psr4.php 这个生成文件中。它就是一个纯 PHP 数组,比如:
['App\' => ['src/']]
这个数组只在执行 composer dump-autoload 时生成——Composer 扫描 composer.json 的 autoload.psr-4 字段,把键值对硬编码进去。运行时,ClassLoader 实例会查这张表,拼出目标路径,再用 file_exists() 预检后 require。
- 没执行
composer dump-autoload→autoload_psr4.php不更新 → 映射完全无效 - 改了
composer.json但没重新 dump → 新增类或改路径 = 找不到 - 生产部署加
--optimize-autoloader会生成 classmap,此时 PSR-4 查找逻辑被跳过
为什么 PSR-4 不支持中文路径
PSR-4 的路径拼接是字面量操作:命名空间去掉前缀后,把 替换成 /,再拼到配置路径后面。整个过程不涉及任何编码处理或文件系统适配。
- 假设配置
"App\": "src/中文目录/",类AppControllerUser会被拼成src/中文目录/Controller/User.php - 如果文件系统不支持 UTF-8 路径(如某些 Windows 环境未启用 UTF-8 locale),
file_exists()直接返回false - PHP 本身不负责路径编码转换,Composer 更不会做额外 decode/encode
- 即使路径能存,Linux 下大小写敏感 + 中文名易误输,调试成本极高
composer.json 里 PSR-4 配置的三个硬坑
配置写错不会报错,只会静默失效。常见错误全集中在斜杠、反斜杠、路径三者一致性上:
- 命名空间键必须以双反斜杠结尾:
"App\": "src/"✅;"App": "src/"❌(会被当 PSR-0 兼容模式) - 路径值必须以正斜杠结尾:
"src/"✅;"src"❌(拼出来变成srcController/User.php) - 路径是相对于
composer.json所在目录的,不是相对于vendor/或入口文件 - JSON 中不能写单个
,否则解析失败;必须写成\(JSON 字符串转义规则)
类找不到?先盯住这三行代码顺序
所有“Class not found”错误,90% 出在加载器注册时机不对。核心就一句话:require 'vendor/autoload.php' 必须是入口文件第一行可执行语句。
- 如果前面有
new AppController()→ PHP 触发 autoload 队列时还是空的 → 直接抛错 - 如果前面有
set_include_path()或自定义__autoload()并返回false→ 拦截后续 Composer 加载器 - CLI 脚本里漏掉这行却“跑通”?大概率是其他依赖已提前加载过该类,别信这个假象
- 框架启动前用了
ini_set('unserialize_callback_func', ...)或类似钩子,也可能干扰 autoload 流程
真正容易被忽略的是:PSR-4 映射表一旦生成,就和 composer.json 彻底解耦。你改配置、删类、重命名空间,只要不 dump-autoload,运行时看到的永远是旧表。











