use-include-path 在 composer 2.0+ 中已被彻底移除,不再支持;composer 不再读取或修改 php 的 include_path,所有自动加载严格遵循 psr-4/psr-0/classmap/files 规范。

use-include-path 在 Composer 2.0+ 中已被彻底移除,无法配置为 true —— 这不是遗漏或兼容开关没打开,而是设计上不再支持。
为什么 use-include-path 不再起作用
Composer 1.x 曾允许通过 composer.json 的 "config": { "use-include-path": true } 让 require 和 include 命中 PHP 的 include_path(比如加载 PEAR 风格包)。但 Composer 2.0 起废弃该行为:所有自动加载严格走 PSR-4/PSR-0/classmap/files,不再干预 PHP 原生 include_path 查找逻辑。
常见错误现象:
• 升级 Composer 后旧项目报 Warning: include(): Failed opening 'XXX.php' for inclusion
• composer dump-autoload -o 后仍无法通过 include 'SomeLegacyClass.php' 加载非 autoloaded 文件
- 这不是配置没生效,是代码路径本身已不被 Composer 管理
- PHP 的
include_path仍存在,但 Composer 不再读取或修改它 -
composer install也不会再把 vendor 目录加进include_path
如何让旧式 include 继续工作
必须显式恢复 include_path,且需在运行时设置(不能靠 Composer 自动注入):
- 在入口文件(如
index.php或bootstrap.php)开头加:set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ . '/vendor');
- 若依赖的是子目录下的 legacy 包(如
vendor/pear/net_url2/Net/URL2.php),得把具体路径加进去:set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ . '/vendor/pear/net_url2');
- 避免用
ini_set('include_path', ...)—— 它会覆盖全局配置,可能破坏其他扩展
更安全的替代方案:用 files 自动加载器
如果那些旧文件是纯函数库(无命名空间、无类定义),优先走 Composer 原生支持的 files 加载机制,比操作 include_path 更可控:
- 在
composer.json中声明:"autoload": { "files": [ "vendor/legacy/helpers.php", "vendor/pear/net_url2/Net/URL2.php" ] } - 执行
composer dump-autoload,这些文件会在每次请求时自动require_once - 优势:不依赖
include_path,不受 PHP 版本或 SAPI 模式影响,且能被 OPcache 缓存 - 注意:路径必须相对于
composer.json所在目录;重复include会导致 fatal error,files自动处理去重
真正麻烦的不是配置开关,而是混用两种加载模型:一边靠 Composer autoload,一边又散落着裸 include。这类遗留代码里,include_path 往往还被多个地方动态修改过,单靠 set_include_path 容易漏掉某个分支路径。动手前先 var_dump(get_include_path()) 看清当前值,比猜配置更可靠。










