根本原因是改完composer.json后未执行composer dump-autoload,导致vendor/composer/autoload_psr4.php未更新;psr-4命名空间须双反斜杠结尾、路径须正斜杠结尾且为相对路径,配置必须在顶层autoload字段中。

composer.json改了autoload但类还是找不到
根本不是 Composer 没读你的配置,而是它压根没把新规则写进 vendor/composer/autoload_psr4.php——改完 composer.json 后不手动执行命令,文件永远是旧的。
-
autoload必须是顶层字段,不能嵌在require或scripts里;拼错成autoloader或带下划线也会被完全忽略 - PSR-4 命名空间必须以双反斜杠结尾:
"App\"✅,"App"❌,"App"(JSON 中只表示一个反斜杠)也 ❌ - 路径必须是相对路径、正斜杠结尾:
"src/"✅,"src"❌(拼接时会变成srcMyClass.php),"./src/"或"/src/"都不认 - 改完立刻跑
composer dump-autoload(简写composer du),别等install或update——它们只在composer.lock变更时才顺带触发 autoload 重生成
运行 dump-autoload -v 却没看到我的命名空间
说明配置没被识别,不是路径或大小写问题,而是更底层的解析失败。这时候别猜,让 Composer 自己报错。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先运行
composer validate,检查 JSON 格式:漏逗号、多逗号、中文引号、BOM 头都会导致 autoload 被跳过 - 用
composer dump-autoload -v看输出末尾:如果连Scanning packages...都没出现,大概率是composer.json语法错误 - 如果输出里有扫描日志但没你的前缀(比如搜不到
App\),再确认命名空间字符串是否被其他配置项意外截断——比如前面加了空格、tab,或后面多了不可见字符 - Linux/macOS 下用
cat -A composer.json | grep App查看是否有隐藏符号
本地能加载,上线就 Class not found
线上环境不会原谅开发时的松懈:大小写、权限、引入路径,三者错一个就全挂。
- 入口文件必须用
require __DIR__ . '/vendor/autoload.php';,不能用require 'vendor/autoload.php'—— 当前工作目录(getcwd())在 CLI 和 Web SAPI 下可能完全不同 - Linux 服务器严格区分大小写:类名
UserService对应的文件必须叫UserService.php,目录必须是src/Service/,不能是src/service/ - 检查
vendor/autoload.php文件权限:ls -l vendor/autoload.php应显示至少-rw-r--r--;Web 用户(如 www-data)必须有读权限 - 上线不要复制
vendor/,而要在服务器上跑composer install --no-dev --optimize-autoloader,确保 autoload 映射与目标环境匹配
第三方包的类明明在 vendor 里却找不到
不是所有包都默认可自动加载。Composer 只按它自己注册的规则找类,不会扫描 vendor 目录下的任意 PHP 文件。
- 先查包有没有声明 autoload:
composer show vendor/package | grep autoload,输出为空或{}表示该包没配自动加载 - 有些包只提供
files类型 autoload(比如纯函数库),这类文件必须靠composer dump-autoload生成autoload_files.php才生效 - Laravel 扩展包常需手动注册服务提供者,不能只靠 PSR-4;查文档确认是否要往
config/app.php的providers数组里加条目 - 若包用了自定义命名空间(如
Acme\Utils\),而你项目没在autoload里声明映射,就得在主项目的composer.json中补上对应 PSR-4 规则并重新dump-autoload










