1

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

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

PHP 解析错误:语法错误,意外的“?”,在第 25 行的 .\vendor\sentry\sentry\src\functions.php 中需要变量 (T_VARIABLE)

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

到目前为止,我认为 Composersvendor\autoload.php仅在需要时才在供应商目录中加载类和函数。不会加载未使用的类,因此不会加载用 PHP 7.4 编写的违规文件。

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

4

2 回答 2

3

您最初的假设是正确的:通常,PHP 自动加载器仅在使用类时才加载它们,而 Composer 只是提供了该自动加载器的实现。

但是,Composer 还包括无条件加载文件的功能。这在包包含无法按需加载的函数、常量或配置时使用(因为 PHP 的自动加载器只处理类)。

您正在使用的软件包之一使用此功能,因此每次您 includevendor/autoload.php时,都需要它指定的文件。在显示的错误消息中,我们可以看到包名sentry/sentry,在该包中composer.json,我们可以看到:

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

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

您还可以在您platform选项composer.json中指定始终请求旧 PHP 版本的依赖项,即使您在 PHP 7.4 下运行 Composer。但是,生成的依赖项存在与 PHP 7.4 不兼容的风险。

于 2020-02-14T17:00:26.427 回答
1

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

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

"config": {
    "platform": {
        "php": "5.6"
    },
},
于 2020-02-14T16:59:23.493 回答