♻️ 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の機能を一切使用できません。
より良い代替手段があります。
PHPコードを8.xから7.xにダウングレードする
PHP 7でコーディングしてPHP 8で動作することを確認する代わりに、逆のアプローチを取ることができます。つまり、プラグインをPHP 8でコーディングし、PHP 7にダウングレードするのです。
これはRectorのおかげで可能です。Rectorはコードのリファクタリングを自動化するツールです。
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まではカバーしていない点に注意してください。ただし、これら2つのPHPバージョンを合わせてもWordPressサイトのわずか3%にすぎないため、大きな問題ではありません。
コードのダウングレードはより優れたアプローチです。その理由は以下の通りです。
- PHP 8.1でコーディングすることで、コードがPHP 8.1および8.2と互換性を持つことが確実になります。
- ダウングレードルールが存在するPHP機能を使用する限り、コードはPHP 7.2、7.3、7.4でも動作します。
- union types、match式、nullsafe演算子など、PHP 8.xの機能を活用できます。
ただし、すべてのPHP 8.xの機能が利用できるわけではありません。たとえば、enumerationをダウングレードするルールは(まだ)存在しないため、それらは使用できません。
テストに関しては、違いはありません。安全を期すために、異なるバージョンのPHPを実行する複数の環境でプラグインを徹底的にテストする必要があります。
コードのダウングレード方法
Gato GraphQLはPHP 8.1で開発され、本番環境向けにPHP 7.2にダウングレードされています。
コードのダウングレードとテスト、そして本番環境へのプラグインリリースは、すべてGitHub Actionsワークフローによって自動化されています。
downgrade_php_tests.yml: コードをダウングレードし、PHP 7.2で解析するgenerate_plugins.yml: リリース用プラグインを生成し、PHP 7.2にダウングレードするintegration_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
お役に立てれば幸いです 🙏