【问题标题】:Avoid composer's autoload.php to parse all files避免 composer 的 autoload.php 解析所有文件
【发布时间】:2020-02-14 16:52:43
【问题描述】:

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

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

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

【问题讨论】:

  • Composer 的工作方式,所以您的代码可能在某处使用该文件。
  • @ceejayoz 不,有问题的包使用autoload: files 指令在每次页面加载时包含文件。详情见我的回答。
  • 有些像function name(): ?string 这样的功能在旧版本中无法运行。

标签: php composer-php php-7.4


【解决方案1】:

您最初的假设是正确的:通常,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 版本的依赖项,即使您在 PHP 7.4 下运行 Composer 也是如此。但是,生成的依赖项存在与 PHP 7.4 不兼容的风险。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      相关资源
      最近更新 更多