require后函数仍找不到,是因为composer require仅安装代码而不自动加载函数;纯函数库需通过autoload.files机制,在vendor/autoload.php被引入时才生效,务必确认入口文件已require该自动加载文件。

require之后函数还是找不到?先确认 autoload 是否触发
装完包,composer require 只是把代码放进 vendor/ 并更新 composer.json 和 composer.lock,它**不会自动加载任何函数**。纯函数库(比如 ramsey/uuid 的 uuid4()、symfony/polyfill-mbstring 的 mb_strlen())必须靠 autoload.files 机制显式引入,而这个机制只在 vendor/autoload.php 被 require 时才执行。
常见错误现象:Call to undefined function uuid4(),但 vendor/ramsey/uuid/src/functions.php 确实存在——问题出在你的入口文件(如 index.php 或 CLI 脚本)里漏掉了:
require __DIR__ . '/vendor/autoload.php';
注意:Web 服务器和 CLI 使用的 PHP 配置可能不同,php -v 和 phpinfo() 显示的 include_path 或 auto_prepend_file 也可能干扰,务必统一验证。
纯函数库的 autoload.files 怎么生效
Composer 官方只支持一种函数加载方式:"autoload": { "files": [...] }。这个数组里的路径必须:
- 相对于
composer.json所在目录(不能用../跨出项目根) - 指向真实存在的 PHP 文件(不能是目录,也不能是不存在的路径)
- 文件内必须直接定义函数(不能只有
class、namespace或语法错误)
例如,某工具库的 composer.json 含:
"autoload": {
"files": ["src/functions.php"]
}
那 Composer 就会在 vendor/autoload.php 生成一段逻辑,每次加载时无条件 require_once 这个 src/functions.php。你不需要、也不应该手动再 require 它。
如果函数仍不可用,运行 composer dump-autoload 强制刷新映射(开发中建议加 -o 优化)。
为什么有些包 require 了却没函数?看它有没有声明 files
不是所有“纯函数库”都默认导出函数。能否直接调用,取决于它的 composer.json 是否配置了 autoload.files。检查方式很简单:
- 进
vendor/your-vendor/your-package/composer.json - 搜索
"files"字段(注意是顶层autoload下的,不是autoload-dev) - 若没有,哪怕文件里写了函数,Composer 也不会自动加载
典型反例:webmozart/assert 是类库,不提供全局函数;symfony/polyfill-* 系列大多有 files,所以能直接用 mb_* 函数;ramsey/uuid 从 4.x 开始把函数收进 src/functions.php 并注册了 autoload.files,但 3.x 没有——版本差异直接影响可用性。
手动补 functions.php?别绕开 Composer 规则
如果你用的库没配 files,但又想用它的函数,**不要**在项目根目录新建 functions.php 再 require 它——这破坏可维护性,且无法被 Composer 自动管理。
正确做法是:
- 确认该库是否真提供了函数(查文档或源码),有些只是类 + 静态方法
- 若确有函数文件但未注册 autoload,可向作者提 PR 补
"autoload": {"files": [...]} - 临时方案:在你自己项目的
composer.json里加"autoload": {"files": ["vendor/xxx/yyy/functions.php"]},然后跑composer dump-autoload(注意路径必须合法,不能跨出项目根)
最后提醒一句:PHP 的函数名是全局命名空间,多个包若定义同名函数会 fatal error。Composer 不做函数名冲突检测,这事得你自己盯紧。











