必须先创建最小 composer.json 并配置 classmap 或 files 自动加载,将 vendor/autoload.php 置于入口文件最顶部,删除旧 require,再执行 composer dump-autoload -o 验证 class_exists;首推 monolog/monolog 实现渐进式现代化。

不能直接在旧项目里跑 composer install,因为绝大多数遗留 PHP 项目压根没有 composer.json,也没有命名空间或 PSR-4 结构——硬上只会报 Could not find a composer.json file,或者因类重复加载直接 fatal error。
先创建最小可用的 composer.json,别碰 require 字段
入口文件(比如 index.php)还没改,第三方包也一个没加,这时候 composer.json 的唯一任务就是让自动加载跑起来。所以:
- 用
composer init生成基础文件,所有提示都回车跳过,最后手动编辑 -
"require"留空,先不引入任何包;重点写"autoload" - 如果旧代码是
User_model.php、My_Class_Name.php这种下划线命名 + 无命名空间结构,就用classmap:{"autoload": {"classmap": ["application/models/", "application/libraries/", "includes/"]}} - 路径必须真实存在,且结尾不带斜杠(
application/models✅,application/models/❌ 在某些版本会扫描失败)
vendor/autoload.php 必须在所有旧 require 之前加载
顺序错了,整个 autoload 就失效。旧项目常有类似这样的启动逻辑:
require 'config.php';<br>require 'database.php';<br>require 'user_model.php'; // ← 这里可能提前声明了 User_model 类
一旦 User_model 被手动 require 过,Composer 的 classmap 再也加载不了它——因为 PHP 不允许重复 class 声明。正确做法是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 把
require 'vendor/autoload.php';放到整个入口文件最顶部 - 旧的
require全部删掉或注释掉,靠 Composer 自动加载兜底 - 如果某些文件是纯函数(如
helpers/common_helper.php),改用"files"autoload:"autoload": {<br> "classmap": ["application/models/"],<br> "files": ["helpers/common_helper.php"]<br>}
运行 dump-autoload 而不是 install
composer install 是给已有 composer.lock 的项目用的;你还没有依赖,也没 lock 文件,此时该用:
-
composer dump-autoload -o:生成优化版autoload_classmap.php,支持无命名空间类 - 每次增删一个
.php文件(尤其是新添了Product_model.php),都得重新跑一遍,classmap不会自动感知文件变化 - 验证是否生效:写个临时脚本
var_dump(class_exists('User_model'));,返回true才算成功 - 如果返回
false,检查路径拼写、文件是否真含class User_model声明、有没有 BOM 头或编码问题
别急着换数据库或路由,先加 Monolog
现代化不是重写,是“可替换”。第一阶段目标只有一个:让 Composer 加载器和旧系统共存。所以:
- 第一个
composer require推荐monolog/monolog—— 它不接管请求、不修改输出、不依赖全局状态,只提供Logger实例 - 替换旧的
log_message()时,封装一层适配器,保持调用方式不变:$logger = new \Monolog\Logger('app');<br>$logger->pushHandler(new \Monolog\Handler\StreamHandler('php://stdout'));<br>// 之后所有 log_message('xxx') → $logger->info('xxx') - 等日志、HTTP 请求(
guzzlehttp/guzzle)、缓存(psr/simple-cache)都稳了,再考虑拆解旧 MVC 层
classmap 的路径是静态快照,不是实时监听;autoload 的加载时机比你想象中更敏感——错一行 require 顺序,后面全白忙。










