必须放第一行,因需在任何类实例化前注册spl_autoload_register;若前置new操作或包裹在函数/条件中,将直接报class not found。

require 'vendor/autoload.php' 必须放第一行吗
必须。这行代码不是“引入一个文件”,而是立即执行 spl_autoload_register() 注册加载逻辑;一旦你在它前面写了 new AppControllerHome(),PHP 就会在类未注册时直接抛 Class not found,不重试、不回退。
- 不能包在
if、函数、try/catch里——PHP 解析到new就触发 autoload,此时作用域还没进函数体 - CLI 脚本和 Web 入口(如
public/index.php)必须各自显式require,它们不共享 autoload 注册状态 - 用
include替代require是隐形炸弹:路径错时不报致命错误,只静默失败 - 框架启动前若已实例化类(比如配置里提前 new 了某个服务),而
autoload.php还没引入,照样炸
PSR-4 映射表从哪来、怎么拼路径
映射数据不在 vendor/autoload.php 里,而在 vendor/composer/autoload_psr4.php 这类生成文件中——它就是一个硬编码的 PHP 数组,比如:['App' => ['src/']]。每次运行 composer dump-autoload,Composer 才会扫描 composer.json 的 autoload.psr-4 字段并重写这个数组。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 命名空间必须以反斜杠结尾:
App\合法,App(无反斜杠)完全不匹配 - 路径末尾必须带斜杠:
src/正确,src会导致拼成srcController/Home.php而非src/Controller/Home.php - 类名
AppControllerHome剥离前缀后得ControllerHome,再把替换成/→Controller/Home.php,最后拼上src/→src/Controller/Home.php - 文件名必须与末级类名严格一致:
Home.php里只能定义class Home;写成class home或文件叫home.php,Linux 下直接失败
改了 composer.json 为什么还是 Class not found
根本原因:你改的是配置源,不是运行时数据。vendor/autoload.php 只是启动器,真正干活的是它加载的 autoload_psr4.php 等静态映射文件——它们不会监听变化,只在 composer dump-autoload 时重写。
- 漏掉
require 'vendor/autoload.php'→ 整个链没注册,连加载器都没启动 - 改了
composer.json但没运行composer dump-autoload→ 映射表还是旧的,PHP 还在用旧表查路径 - 手动复制别人项目的
autoload.php过来大概率报错——里面引用的autoload_psr4.php路径是相对生成时环境硬写的 - CLI 脚本里漏掉这行却“偶然”跑通?大概率是其他依赖已提前加载过该类,别信这个假象
autoload.php 和 autoload_real.php 到底干啥
vendor/autoload.php 是 Composer 命令生成的引导入口,只做一件事:引入 vendor/composer/autoload_real.php 并调用 ClassLoader::getLoader();autoload_real.php 才是真正注册 spl_autoload_register() 的地方,它把 PSR-4、classmap、files 三类加载逻辑挂进 PHP 的 autoload 队列。
-
autoload.php不解析composer.json,也不扫描代码,只加载已生成的映射文件 -
autoload_psr4.php等文件内容全是硬编码字符串拼接,不验证类是否存在、不检查文件名是否匹配类名、不运行任何用户代码 - 删掉
vendor/autoload.php后再运行composer install,它会立刻重建;手写一个基本没用,路径和哈希都对不上
composer dump-autoload,哪怕只是改了个路径或加了个命名空间前缀。










