在 composer.json 中需通过 "psr-4" 显式声明自定义目录(如 "App": "app/"),用 "files" 加载无命名空间的函数文件,修改后必须执行 composer dump-autoload 生效;不规范命名可用 "classmap" 扫描兼容。

composer.json 里怎么配 autoload 的自定义目录
Composer 默认只加载 src/ 下的 PSR-4 类,要加载其他目录(比如 app/、lib/、extensions/),必须显式声明。不配就 Class not found,没商量。
最常用的是 "psr-4",它支持带命名空间前缀的映射;如果目录里是传统 require 风格的函数文件(无命名空间),得用 "files" 字段。
-
"psr-4": { "App\": "app/" }→ 加载app/Controller/UserController.php对应AppControllerUserController -
"psr-4": { "Lib\": "lib/" }→ 注意结尾斜杠不能漏,否则 Composer 会忽略 -
"files": ["lib/helpers.php", "app/functions.php"]→ 这些文件会在每次autoload初始化时无条件require_once
运行 dump-autoload 后还是找不到类?检查这三处
改完 composer.json 不等于生效,很多人卡在这步:没重新生成自动加载映射。
- 必须执行
composer dump-autoload(或简写composer du),不是install或update - 确认 PHP 实际加载的是你修改后的
vendor/autoload.php,而不是旧项目残留的缓存副本 - PSR-4 映射路径是相对于
composer.json所在目录的,比如app/指的是和composer.json同级的app/目录,不是子目录里的
files 自动加载的坑:不能带命名空间,也不能重复 require
"files" 字段适合加载工具函数、常量定义等全局脚本,但它有硬限制:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 文件内不能声明
namespace,否则会报Cannot declare namespace because the script was included - 所有
"files"列表里的文件,在每次require vendor/autoload.php时都会执行一次 —— 如果里面含define()或function_exists()检查不到位,容易报Cannot redeclare - 不支持通配符,每个文件都得列全路径,比如
"lib/str.php"和"lib/array.php"得分开写
想让自定义目录也走 PSR-4,但类文件名不规范怎么办
PSR-4 要求文件名和类名严格一致(User.php → class User),如果你的旧代码是 user.class.php 或 UserController.php 但类名叫 User,PSR-4 就不认。
这时别硬套 PSR-4,两个务实选择:
- 用
"classmap":运行composer dump-autoload --classmap-authoritative,它会扫描指定目录(如"classmap": ["legacy/"])并生成完整类名→路径映射,不依赖文件名规则 - 或者直接重构——把
user.class.php改成User.php,类声明改成class User,这是长期维护成本最低的方式
classmap 生成后体积略大,但兼容性最强;PSR-4 更轻量,但对目录结构和命名有洁癖。选哪个,取决于你手里的代码有多“老”。

















