旧项目迁移到composer的唯一稳妥路径是classmap+files:classmap扫描真实存在的无命名空间类路径(结尾不带斜杠),files加载纯函数文件,vendor/autoload.php必须置于入口第一行且删除所有旧require,每次增删文件后执行composer dump-autoload -o验证class_exists。

旧项目里直接 require 一堆文件、满屏 _autoload 或手动 include,想用 Composer 又怕崩?别硬套 PSR-4,classmap + files 是唯一稳妥路径。关键不是“怎么配”,而是“顺序不能错、dump 不能漏、旧 require 必须删”。
classmap 扫描路径必须真实存在且结尾不带斜杠
旧代码散在 models/、libraries/、includes/ 这类目录下,没命名空间、类名含下划线(如 User_model),PSR-4 根本不认。classmap 是唯一选择,但它对路径极其敏感:
-
"classmap": ["models", "libraries"]✅ —— 路径存在,结尾无斜杠 -
"classmap": ["models/", "libraries/"]❌ —— 某些 Composer 版本会跳过扫描,class_exists('User_model')返回false - 路径必须相对于
composer.json所在位置,比如composer.json在项目根,models就得是同级目录 - 新增一个
Product_model.php后,不跑composer dump-autoload -o,它永远加载不到
files 加载纯函数文件要防重复定义
像 helpers/common_helper.php 这种只定义函数、没 class 的文件,必须走 files 字段,但这里最容易出 fatal error:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"files": ["helpers/common_helper.php"]—— 路径是相对composer.json的,不是vendor/autoload.php - 这个文件会在每次
require 'vendor/autoload.php'时被require_once,所以里面不能有function foo() { }以外的执行逻辑(比如echo、new实例) - 如果旧入口里还留着
require 'helpers/common_helper.php',就会报Cannot redeclare foo() - 多个
files按数组顺序加载,有依赖关系(如 A.php 依赖 B.php 里的常量)就得把 B 放前面
vendor/autoload.php 必须是入口文件第一行
旧项目启动流程常是:require 'config.php'; require 'database.php'; require 'User_model.php';。只要其中任一文件提前声明了 User_model 类,Composer 的 classmap 就彻底失效。
- 入口文件(如
index.php)第一行必须是:require __DIR__ . '/vendor/autoload.php'; - 所有旧的
require和include都得删掉或注释掉,让自动加载兜底 - 不能写成
require_once——vendor/autoload.php内部已处理,重复写反而可能掩盖路径错误 - 验证是否生效:临时加一行
var_dump(class_exists('User_model'));,返回true才算通
全局变量不是靠 Composer config --global 设置的
别被“全局变量”这个词带偏。Composer 没有运行时全局变量机制,.env 文件里的 APP_ENV 或数据库配置,跟 composer install 完全无关。
-
composer config --global只管网络、缓存、认证类参数(如github-oauth、cache-dir),不影响代码逻辑 - 项目级环境变量由 PHP 脚本自己加载(比如 Laravel 的
Dotenv),Composer 不参与 - 想让旧代码读取新配置?要么改代码去
getenv(),要么在files加载的文件里define()常量,别指望 Composer 自动注入
真正卡住人的从来不是配置字段写错,而是删不干净旧 require、扫不全 classmap 路径、忘了每次增删文件都要 dump-autoload —— 这三件事漏一个,整个自动加载就静默失效。










