必须分阶段解耦而非直接删 vendor 再 install,否则 90% 概率报 class not found 或 cannot redeclare;需通过 composer show 或扫描 require/spl_autoload_register 补全依赖,按 php 版本、命名空间规范配置 autoload(psr-4/classmap/files),严格校验路径大小写、autoload.php 引用方式、composer.lock 提交与 ci 使用 install --no-dev --optimize-autoloader,并检查平台扩展与文件权限。

直接迁移会炸,必须分阶段解耦,而不是删掉 vendor 再跑 install。 旧项目里手动 require、硬编码路径、类名冲突、autoload 逻辑混杂——这些不会因为加了 composer.json 就自动消失。强行一步到位,90% 概率 Class not found 或 Fatal error: Cannot redeclare function。
怎么补全 composer.json 而不漏依赖
别手写 require 列表。先看运行时实际加载了什么:
- 如果有残留的
vendor/目录,运行composer show --installed抽出已安装包和版本 - 如果连
vendor/都没有,就扫描所有require、require_once和spl_autoload_register注册的路径,重点盯lib/、includes/、thirdparty/这类目录 - 发现用了
monolog/monolog但没声明?补进"monolog/monolog": "^2.10";发现是 SVN checkout 的某分支代码,就得加repositories指向私有 VCS,不能硬塞进 require - 检查
composer.json里的"php"字段是否匹配当前环境,比如旧项目跑在 PHP 7.4,新服务器是 8.2,但锁文件里某包只支持^7.4,install 就会直接失败
autoload 怎么覆盖旧的 include 逻辑
Legacy 项目最常卡在这步:类文件明明在,却报 Class not found。原因不是路径错,而是 autoload 没接管、或旧 require 还在执行。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"psr-4"只适用于有命名空间 + 目录结构规范的代码,比如"App\": "src/"表示AppFoo对应src/Foo.php,不是src/App/Foo.php - 老代码没命名空间?用
"classmap",然后跑composer dump-autoload --classmap-authoritative扫描整个目录生成映射,比"files"更可靠 -
"files"只放全局函数文件(如helpers.php),滥用会导致每次 autoload 都 require 这些文件,极易重复定义 - 补完 autoload 后,必须删掉所有旧的
require 'lib/xxx.php',否则加载顺序一乱,Fatal error 就来了
为什么 vendor/autoload.php 加载后类还是找不到
常见错觉是“我写了 autoload,它该生效了”,其实 autoload_static.php 是生成时快照,不会随配置动态更新。
- 改过
composer.json的autoload段?必须立刻执行composer dump-autoload -o,否则 PHP 根本看不到新加的映射 - 检查
vendor/composer/autoload_psr4.php里生成的数组,确认键值对符合预期,比如"App\": ["src/"],而不是"App\": ["src/App/"] - Windows 下开发、Linux 上部署?注意路径大小写敏感,
src/Helper.php和src/helper.php在 Linux 是两个文件,autoload 会直接失效 - 硬编码了
require_once '/var/www/project/vendor/autoload.php'?改成require __DIR__ . '/vendor/autoload.php',否则 Docker 或 CI 下路径一变就静默失败
迁移后 CI 构建失败的真正原因
不是脚本写错了,而是 lock 文件和环境不匹配。
-
composer.lock必须提交进 Git,且.gitignore里不能有/composer.lock—— 漏掉它,composer install就退化成update,所有人拉到的版本都不一样 - CI 流水线要用
composer install --no-dev --optimize-autoloader,不是update,更不能加--ignore-platform-reqs掩盖问题 - 新服务器 PHP 版本低了?先跑
composer check-platform-reqs,它会明确告诉你缺ext-mbstring还是ext-xml,而不是靠猜 - 权限问题常被忽略:Web 用户(如
www-data)必须能读vendor/autoload.php,chgrp -R www-data vendor && chmod -R g+r vendor比反复查 nginx 错误日志快得多
最麻烦的从来不是写配置,而是旧代码里那些没文档的加载顺序、大小写混用的类名、以及写死在 index.php 里的 set_include_path()。每改一行 autoload,都得跑一次 dump-autoload -o 并验证类是否真能 new 出来——别跳这步。










