Class not found 错误主因是自动加载未生效:未引入 vendor/autoload.php、命名空间与路径不匹配、dev 依赖被误用或 autoload-dev 映射未剔除;需检查 composer.lock、执行 composer install --no-dev --optimize-autoloader、确认 autoload_dev.php 不存在,并统一 config.platform 版本。

直接结论:不是 Composer 不支持环境隔离,而是你没用对 --no-dev、config.platform 和 autoload-dev 的组合逻辑——漏掉任一环节,线上就可能 Class not found 或体积暴增。
为什么加了 --no-dev 还会装上 phpunit?
根本原因不是参数写错了,而是 composer.lock 文件本身记录了 dev 包。Composer install 只照 lock 装,不看 composer.json 里有没有 require-dev。
- 检查
composer.lock:搜索"name": "phpunit/phpunit",如果出现在packages(而非packages-dev)数组里,说明上次是用composer update(没加--no-dev)生成的 - CI 构建前必须跑:
composer update --no-dev --lock,再提交更新后的composer.lock - Dockerfile 中不能只写
RUN composer install,必须显式写死:RUN composer install --no-dev --optimize-autoloader - 别信
COMPOSER_DEV_MODE=0环境变量——它优先级低、难调试、CI 中常被覆盖
本地 PHP 8.3,线上 PHP 8.1,依赖装不上怎么办?
config.platform.php 是唯一能统一依赖解析逻辑的配置项,但它不改真实 PHP 版本,只告诉 Composer “按这个版本选包”。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在
composer.json里加:"config": { "platform": { "php": "8.1.0" } }—— 注意必须写死"8.1.0","^8.1"无效 - 它只影响
composer update阶段的包选择,不影响运行时行为:线上真没装ext-gd,imagecreate()还是报错 - 上线构建更干净的做法是加
COMPOSER_PLATFORM_CHECK=0,绕过校验,但前提是确认所有包已在目标环境中验证过 - 别把
config.platform当万能补丁——它救不了扩展缺失、函数废弃或语法错误
autoload-dev 里的类,生产环境为啥还会 Class not found?
autoload-dev 控制的是“哪些路径能被自动加载”,不是“哪些类会被执行”。只要代码里硬写了 new TestsFooTest() 或 use App\Tests\BarTest,哪怕没装包、没注册 autoload,也会在运行时触发 fatal error。
- 检查所有生产入口文件(如
public/index.php、命令行脚本),确保没无条件引用Tests\*、DevConfig等命名空间 - 用
grep -r "use.*Test\|new.*Test\|dump(" src/ app/快速扫一遍硬依赖 -
autoload-dev下的 PSR-4 映射末尾必须带反斜杠,比如"App\Tests\": "tests/",少一个就失效 - 执行
composer dump-autoload --no-dev才会真正从vendor/autoload.php中剔除 dev 映射;只跑composer install --no-dev不够
怎么确认 --no-dev 真生效了?
不能只看命令行输出,得查三处结果:
-
vendor/目录下不该有phpunit/、phpstan/、symfony/var-dumper/等目录 -
composer.lock里packages数组中不应出现 dev 包名;可用composer show --dev,返回No dependencies installed for development才算成功 -
vendor/composer/autoload_dev.php文件必须不存在——PHAR 打包或容器部署时漏删它,是线上Class not found的高频根因
最常被忽略的是 lock 文件和 autoload 映射的同步性:--no-dev 只跳过安装,不清理历史残留;一次手抖的 composer update 就能让整个隔离机制失效。

















