classmap是遗留php项目自动加载的唯一务实方案,因其不依赖命名空间、可扫描任意目录下含class/interface声明的文件;需正确配置路径、确保vendor/autoload.php为入口第一行,并配合files autoload处理纯函数文件。

classmap 是遗留代码自动加载的唯一务实选择
PSR-4 不适用于没有命名空间、类名含下划线(如 User_model)、文件散落在 models/ libraries/ includes/ 等目录的老项目。强行套用 PSR-4 会触发 Class 'User_model' not found,因为 Composer 按命名空间路径去查,而你的类根本不在 User/model.php 这种结构里。
必须用 classmap:它不解析命名空间,只扫描指定目录下所有 .php 文件,提取 class 和 interface 声明,生成扁平映射表。这是目前唯一能兜住传统 PHP 风格代码的方案。
-
composer.json中的classmap值必须是真实存在的目录路径,结尾不能带斜杠("application/models"✅,"application/models/"❌——某些 Composer 版本会跳过扫描) - 路径支持相对路径(从
composer.json所在位置起算),也支持 glob 模式,如"app/**/*.php" - 执行
composer dump-autoload -o后,所有匹配到的类名会被写入vendor/composer/autoload_classmap.php,可直接查看验证
vendor/autoload.php 必须放在所有 require 之前
旧项目入口常有类似逻辑:require 'config.php'; require 'database.php'; require 'User_model.php';。一旦 User_model.php 被提前 require,PHP 就已声明了该类,后续 Composer 的 classmap 加载会直接跳过——报 Cannot declare class User_model, because the name is already in use。
正确顺序只有一条铁律:require 'vendor/autoload.php'; 必须是入口文件(如 index.php)的第一行有效代码,之后再删掉或注释掉所有旧 require。
- 不要试图“混用”:一边保留手动
require,一边指望 Composer 加载部分类——类加载冲突几乎必然发生 - 如果某些文件是纯函数集合(如
helpers/common_helper.php),改用filesautoload,它会在autoload.php加载时无条件include_once,不依赖类声明 - 确认生效:加一句
var_dump(class_exists('User_model'));在autoload.php后面,应输出true
别在没 composer.json 的老项目里直接跑 composer install
直接进一个二十年前的 PHP 项目根目录敲 composer install,大概率得到 Could not find a composer.json file,或者更糟:因 vendor/ 不存在 + 自动加载未启用,导致整个页面白屏。
起步动作只有两个:先 composer init 生成空壳 composer.json,然后手动编辑,只填 autoload 段,其他字段(包括 require)全留空。目标不是引入包,是让自动加载跑起来。
-
composer init过程中所有提示都按回车跳过,避免误填错误的name或description影响后续判断 - 生成的
composer.json至少要有"autoload": {"classmap": ["models/", "libs/"]},路径按你实际目录调整 - 执行
composer dump-autoload -o,而不是install——后者会尝试读lock、拉取远程包,完全不必要
纯函数文件要用 "files" autoload,不是 classmap
像 functions.php、helpers/string_helper.php 这类只定义函数、不声明类的文件,classmap 完全无效——它只扫 class 和 interface 关键字。若硬塞进 classmap,这些文件不会被加载,调用函数时直接报 Call to undefined function。
必须改用 files autoload,它在 Composer 初始化阶段就 include_once 列出的所有文件,与类是否存在无关。
- 配置示例:
"autoload": {"files": ["helpers/common_helper.php", "functions/global.php"]} - 路径必须准确,且相对于
composer.json位置;建议用相对路径,避免绝对路径导致迁移失败 - 多个文件之间无加载顺序依赖,但若存在函数重定义(如两个 helper 都定义了
str_slug()),运行时会 fatal error,需人工清理
User_v2.php 文件后,必须重新运行 composer dump-autoload -o 才能生效;而 files 列表里的文件,哪怕内容变了,也不需要重生成 autoload —— 但前提是路径本身没变。











