Composer自动加载靠vendor/autoload.php注册预生成映射表而非手动写函数;必须首行引入以触发spl_autoload_register注册PSR-4等加载器,改配置后须执行composer dump-autoload更新映射文件。

Composer 自动加载不是靠写函数实现的,而是靠 vendor/autoload.php 注册预生成的映射表;私有包不配 repositories 字段,composer require 就永远找不到它。
为什么 require 'vendor/autoload.php' 必须放在入口文件第一行
这行代码不是“引入一个工具”,而是执行注册动作:它会立刻调用 ClassLoader::getLoader(),并通过 spl_autoload_register() 把 PSR-4、classmap 等加载逻辑挂进 PHP 的自动加载队列。一旦漏掉或放错位置:
- 入口文件里先
new AppController()再require→ PHP 实例化时 autoload 队列为空,直接报Class not found - 框架启动前用了
set_include_path()或返回false的自定义__autoload→ 拦截后续 Composer 加载器 - CLI 脚本中“偶然”跑通 → 可能是其他依赖已提前加载过该类,掩盖问题
composer.json 里 autoload 配置怎么写才生效
PSR-4 映射必须严格满足路径拼接规则,否则命名空间转路径就出错。常见配置错误和对应现象:
-
"App\": "src/"合法;"App": "src/"(缺末尾反斜杠)→ 命名空间AppControllerUserController会被当作顶层命名空间,找不到src/Controller/UserController.php -
"App\": "src"(路径缺末尾斜杠)→ 拼成srcController/UserController.php,404 - 文件名必须与类名完全一致(大小写敏感):
UserController.php里不能定义class usercontroller,Linux 下直接失败 - 每个 PSR-4 映射只支持一个根目录:
"App\": ["src/", "app/"]→ 第二个路径被静默忽略
改了 composer.json 或加了新类,为什么还是 Class not found
根本原因是映射表没更新。vendor/autoload.php 只是启动器,真正干活的是它加载的 vendor/composer/autoload_psr4.php 这类静态 PHP 数组文件 —— 它们不会监听文件变化,只在 composer dump-autoload 时重写。
立即学习“PHP免费学习笔记(深入)”;
- 新增了
app/Service/Logger.php,但没运行composer dump-autoload→ 映射里没有这条记录 - 手动改过
vendor/composer/autoload_psr4.php→ 下次dump-autoload会被覆盖,白干 - CI 环境用了
--no-scripts→autoload_psr4.php文件可能根本没生成 - 开发中频繁改类名或移动文件?可加
-o参数:composer dump-autoload -o会额外生成 classmap,跳过路径推导,但构建慢、体积大,只建议部署时用
私有包仓库必须在项目级 composer.json 声明 repositories
Composer 不会自动发现你内网 Git 或私有 Satis 服务,必须显式告诉它“去哪找”。只改包自身的 composer.json 没用,这是项目级配置。
- 类型选
"type": "composer"(推荐):指向支持packages.json的 HTTP 服务,如 Satis 或 Private Packagist - 类型选
"type": "vcs"(简单场景):写 Git 地址,如"url": "https://git.internal/project-a",但要求该 Git 支持读取composer.json和 tag - 认证凭据只能通过
auth.json(权限600)配置,绝不能写进composer.json,否则泄露风险极高 - vcs 包版本依赖 git tag,且必须符合语义化格式(如
v1.2.3),否则composer require找不到可用版本
最容易被忽略的一点:PSR-4 映射中命名空间末尾的反斜杠和路径末尾的斜杠,不是“风格问题”,而是拼接时的锚点符号——少一个,整个路径就偏移了。Linux 下大小写敏感、CI 环境跳过 autoload 生成、手改 vendor 下生成文件……这些都不是边缘情况,而是线上报错最常卡住的地方。



















