博客

♻️ 最大化 WordPress 6.4 和插件目录的 PHP 兼容性

Leonardo Losoviz
作者:Leonardo Losoviz ·

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 代码。

例如,规则 DowngradeMatchToSwitchRectormatch 运算符转换为 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 工作流程自动完成:

如需了解更多,我撰写了几篇关于此主题的文章:

希望对您有所帮助 🙏


订阅我们的新闻通讯

及时了解 Gato GraphQL 的所有更新。