♻️ 最大化 WordPress 6.4 和插件目录的 PHP 兼容性
WordPress 6.4「Shirley」已正式发布。建议在 PHP 8.1 或 8.2 下运行,但最低支持的 PHP 版本仍为 7.0。
因此,我们的 WordPress 插件需要(尽可能地)支持低至 PHP 7.0 的版本,同时与 PHP 8.1 和 8.2 保持兼容。
最合乎逻辑的方式是使用 PHP 7.0 编写插件代码,同时遵守以下原则:
- 不使用在 PHP 7.x 中已废弃的功能(因为这些功能在 PHP 8.x 中已被移除)
- 不使用在 PHP 8.x 中已废弃的功能(因为这些功能会产生警告)
为了确保插件代码具有兼容性,需要在运行不同 PHP 版本的多个环境中进行全面测试。
使用 PHP 7.x 编码有一个明显的缺点:插件代码必须与 PHP 8.x 兼容,但却无法使用其任何功能,例如 union types、match 表达式、nullsafe 运算符等。
有一种更好的替代方案。
将 PHP 代码从 8.x 降级到 7.x
我们不必在 PHP 7 中编码并确保其在 PHP 8 下正常运行,而是可以反其道而行之:在 PHP 8 中编写插件代码,然后将其降级到 PHP 7。
这得益于 Rector,一个可自动化 PHP 代码重构的工具。
Rector 提供了将代码从 PHP 8.1 降级到 PHP 7.2 的规则。这意味着我们可以在 WordPress 插件中使用这些现代特性,因为它们可以被降级为 PHP 7.2 代码。
例如,规则 DowngradeMatchToSwitchRector 将 match 运算符转换为 switch 运算符:
class SomeClass
{
public function run()
{
- $message = match ($statusCode) {
- 200, 300 => null,
- 400 => 'not found',
- default => 'unknown status code',
- };
+ switch ($statusCode) {
+ case 200:
+ case 300:
+ $message = null;
+ break;
+ case 400:
+ $message = 'not found';
+ break;
+ default:
+ $message = 'unknown status code';
+ break;
+ }
}
}请注意,这些规则仅支持降级到 PHP 7.2,并不能一路降级到 PHP 7.1 和 7.0。但这并不是大问题,因为这两个 PHP 版本加起来仅占 WordPress 站点的 3%。
代码降级是一种更优的方案,原因如下:
- 通过在 PHP 8.1 中编码,我们可以完全确保代码与 PHP 8.1 和 8.2 兼容。
- 只要使用存在降级规则的 PHP 功能,代码也可以在 PHP 7.2、7.3 和 7.4 下运行。
- 我们可以充分利用 PHP 8.x 的功能,例如 union types、match 表达式、nullsafe 运算符等。
需要注意的是,并非所有 PHP 8.x 功能都可使用。例如,目前(尚)没有降级枚举类型的规则,因此无法使用枚举。
在测试方面没有区别:为了安全起见,仍然需要在运行不同 PHP 版本的多个环境中对插件进行全面测试。
如何降级代码
Gato GraphQL 使用 PHP 8.1 开发,并在生产环境中降级到 PHP 7.2。
代码降级、测试以及发布用于生产的插件,全部通过 GitHub Actions 工作流程自动完成:
downgrade_php_tests.yml:将代码降级并使用 PHP 7.2 进行分析generate_plugins.yml:生成发布用插件,将其降级到 PHP 7.2integration_tests.yml:将新生成的插件安装到运行不同 PHP 版本的多个 InstaWP 实例中,并执行集成测试
如需了解更多,我撰写了几篇关于此主题的文章:
- 🦸🏿♂️ Gato GraphQL is now transpiled from PHP 8.0 to 7.1
- Transpiling PHP code from 8.0 to 7.x via Rector
- Coding in PHP 7.4 and deploying to 7.1 via Rector and GitHub Actions
希望对您有所帮助 🙏