避免 composer 的 autoload.php 解析所有文件

Avoid composer's autoload.php to parse all files

这是我的问题:我已经将一个复杂的应用程序升级到 PHP 7.4,是的,我没有进行足够彻底的测试。

现在我想 运行 使用较旧的 PHP 版本执行任务,但它无法解析我所有的供应商文件。这是错误和行。这是 PHP 7.4 的新功能。

PHP Parse error: syntax error, unexpected '?', expecting variable (T_VARIABLE) in .\vendor\sentry\sentry\src\functions.php on line 25

 function captureMessage(string $message, ?Severity $level = null): ?string

直到现在我都认为,Composers vendor\autoload.php 仅按需加载 类 并在 vendor 目录中运行。未使用 类,因此不会加载 PHP 7.4 中编写的有问题的文件。

不幸的是,我注意到 require_once('./vendor/autoload.php') 足以看到解析错误。是否可以以某种方式配置 Composer,使其不预加载供应商文件,而是仅在请求 类 或函数时才加载它们?

在您的 composer.json 中,您可以将 platform 添加到您的配置中,以强制它解析对特定版本 PHP 的依赖关系。

https://getcomposer.org/doc/06-config.md#platform

"config": {
    "platform": {
        "php": "5.6"
    },
},

您最初的假设是正确的:一般来说,PHP 自动加载器仅在使用时加载 类,而 Composer 只是提供该自动加载器的实现。

但是,Composer 还包括 a feature to unconditionally load a file。当包包含不能按需加载的函数、常量或配置时使用(因为 PHP 的自动加载器只处理 类)。

您使用的其中一个包使用了此功能,因此每次包含 vendor/autoload.php 时都需要它指定的文件。在显示的错误消息中,我们可以看到包名称 sentry/sentry,在 that package's composer.json 中,我们可以看到:

"autoload": {
    "files": [
        "src/functions.php"
    ],
    "psr-4": {
        "Sentry\": "src/"
    }
},

解决此问题的最佳方法可能是降级此依赖项,以及任何其他包含在 PHP 7.4 下仅 运行 的代码的依赖项。为此,您只需在旧版本的 PHP 上重新 运行 composer update,它只会选择支持该版本的软件包。

您还可以在 composer.json 中指定 the platform option 以始终请求旧 PHP 版本的依赖项,即使您 运行ning Composer 低于 [=30] =] 7.4。但是,存在生成的依赖项与 PHP 7.4.

不兼容的风险