避免作曲家的autoload.php解析所有文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了避免作曲家的autoload.php解析所有文件相关的知识,希望对你有一定的参考价值。

这是我的问题:我已经将复杂的应用程序升级到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

直到现在我还认为,作曲家vendorautoload.php仅在需要时才在供应商目录中加载类和函数。未使用的类,因此不会加载用PHP 7.4编写的有问题的文件。

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

答案

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

但是,Composer也包含a feature to unconditionally load a file。当软件包包含无法按需加载的函数,常量或配置时使用(因为PHP的自动加载器仅处理类)。

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

composer.json

解决此问题的最佳方法可能是降级此依赖关系,以及任何其他仅包含在PHP 7.4下运行的代码。为此,您只需在较早版本的PHP上重新运行"autoload": { "files": [ "src/functions.php" ], "psr-4": { "Sentry\": "src/" } }, ,它将仅拾取支持该版本的软件包。

您还可以在composer update中指定the platform option以始终请求较早版本的PHP依赖,即使您在PHP 7.4下运行Composer时也是如此。但是,存在产生的依赖项与PHP 7.4不兼容的风险。

另一答案

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

composer.json

platform

以上是关于避免作曲家的autoload.php解析所有文件的主要内容,如果未能解决你的问题,请参考以下文章

PHP使用来自作曲家的自动加载器添加自定义命名空间

如何在没有作曲家的情况下使用PHP库(FPDI与FPDI保护)

没有作曲家的枪口

在php交互式shell中使用作曲家添加的依赖项

vendor/autoload.php怎么生成

作曲家从不同目录自动加载子命名空间