“供应商加载”是误称,实际是通过vendor/autoload.php注册composer自动加载器;它不直接加载类,而是调用classloader::getloader()并用spl_autoload_register()挂载psr-4、classmap、files等策略。

“供应商加载”不是 Composer 的官方术语,它通常是对 vendor/autoload.php 这一文件作用的误称或口语化表达。真正起作用的是 Composer 的自动加载机制,而 vendor/autoload.php 只是启动这个机制的唯一入口——它本身不加载任何类,只负责注册加载器。
require 'vendor/autoload.php' 必须放在第一行
这行代码不是“引入一堆类”,而是执行一次关键注册:调用 ClassLoader::getLoader(),再通过 spl_autoload_register() 把 PSR-4、classmap、files 等多种加载逻辑挂进 PHP 的自动加载队列。
- 如果写在
new AppService()后面,PHP 在实例化时已触发自动加载,但队列为空,直接报Class not found,不会提示“加载器未注册” - 不能包在
if、函数或try/catch里——PHP 解析阶段就可能触发类加载 - CLI 脚本和 Web 入口(如
public/index.php)必须各自显式引入,作用域不共享 - 别用
include替代require_once:失败时不报错,问题更隐蔽
PSR-4 映射表从哪来、怎么生效
映射数据不在 vendor/autoload.php 里,而在 vendor/composer/autoload_psr4.php 中,它是一个硬编码的 PHP 数组,例如:['App' => ['src/']] 。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 这个数组由
composer.json中的"psr-4"字段驱动,每次运行composer dump-autoload才会重新扫描并生成 - 命名空间末尾必须带反斜杠:
"App\"正确,"App"会被忽略或降级为 PSR-0(已废弃) - 路径末尾必须带斜杠:
"src/"正确,"src"会导致拼出srcController.php而非src/Controller.php - 类
AppControllerHome严格对应src/Controller/Home.php,大小写、目录层级、文件后缀全需一致
classmap 和 files 各自该用在什么场景
classmap 和 files 是 autoload 的补充策略,与 PSR-4 并存但语义完全不同:
-
classmap:适合无命名空间的老代码、第三方库、或你明确想用 O(1) 查找加速的场景;需执行composer dump-autoload -o或配置"optimize-autoloader": true才生成autoload_classmap.php -
files:只用于加载纯函数、常量、全局配置等无class声明的 PHP 文件;写进"files": ["src/helpers.php"]后,每次引入vendor/autoload.php就会无条件require_once一次 - 三者加载顺序是
classmap → PSR-4 → PSR-0 → files,但files不参与“按需加载”,它是预加载 - 别把类文件塞进
files,否则会报Cannot declare class X, because the name is already in use
最常被忽略的一点是:改了 composer.json 的 autoload 配置、移动了类文件、新增了类,都必须手动运行 composer dump-autoload ——它不是刷新缓存,而是重绘整个映射表;不执行,vendor 里的映射文件就是旧的,PHP 自然找不到类。










