避免 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.
不兼容的风险
这是我的问题:我已经将一个复杂的应用程序升级到 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.