files字段需写相对于composer.json的php文件路径,支持通配符;修改后必须运行composer dump-autoload,且入口文件须显式require 'vendor/autoload.php'才能生效。

composer.json 的 files 字段怎么写才生效
直接在 autoload 下加 files 数组,路径必须是相对于 composer.json 所在目录的相对路径,且文件必须存在、可读。Composer 不会帮你创建文件,也不会提示路径错——它只是静默跳过不存在的条目。
-
files数组里的每个路径都必须是 PHP 文件(如src/functions.php),不能是目录 - 路径支持通配符(
*)但仅限于glob()支持的语法,且必须用引号包裹:"src/*.php" - 多个文件按数组顺序加载,后面文件能覆盖前面同名函数(PHP 函数不能重定义,所以重复定义会报
Fatal error: Cannot redeclare) - 修改后必须运行
composer dump-autoload(或composer install/update)才会写入vendor/autoload.php
为什么 functions.php 里定义的函数在 CLI 下可用,Web 请求却报“function not found”
常见原因是 Web 服务器(如 Apache/Nginx)和 CLI 使用的 PHP 配置不同,导致 vendor/autoload.php 没被正确引入。Composer 的 files 不会自动执行,它只把文件路径注册进 autoloader,最终靠 require_once 'vendor/autoload.php' 触发加载。
- CLI 脚本通常手动
require了 autoload,所以函数可用 - Web 入口(如
index.php)若漏掉require 'vendor/autoload.php',files就完全不生效 - 检查是否用了
include或require错误路径(比如少写了vendor/前缀) - 某些框架(如 Laravel)会预加载部分文件,但不会自动触发
files—— 仍需确保入口已加载 autoload
files 和 psr-4 同时存在时谁先加载
加载顺序取决于你在 composer.json 中声明的顺序:files 在前就先加载,反之亦然。但实际影响有限,因为 psr-4 是按类名懒加载,而 files 是启动即加载所有文件内容。
- 全局函数必须在使用前定义,所以
files应放在autoload的顶层,避免依赖其他 autoloaded 类时函数还没定义 - 如果
files里调用了某个 PSR-4 类,而该类尚未加载,就会报Class not found—— 这不是顺序问题,是逻辑依赖问题 - 建议把纯函数文件(无类依赖、无副作用)放
files,有依赖的逻辑尽量封装成类,走psr-4
生产环境部署后 files 加载失败的隐蔽原因
最常被忽略的是文件权限和符号链接。Composer 在 dump-autoload 时会把 files 路径硬编码进 vendor/composer/autoload_files.php,如果部署时用了 rsync 或容器挂载,路径可能失效。
- 检查
vendor/composer/autoload_files.php里生成的路径是否真实存在(注意软链是否被展开或丢失) - 某些 CI/CD 流程会清空
vendor但保留composer.lock,若没重新composer install,autoload_files.php就不会更新 - Git 忽略了
vendor/,但你又手动复制了旧 vendor 目录——里面仍是旧的 autoload 文件 - Windows 开发、Linux 生产时路径大小写敏感(如
Src/vssrc/),files路径写错一个字母就静默失效
vendor/autoload.php 被入口加载。其余都是围绕这两点排查的细节。










