PHP8用にWordPressサイトを準備する方法

公開: 2022-07-06

WordPressサイトにはPHPが必要であり、PHPが進化するにつれて、WordPressはそれに追いついてきました。 最近では、PHP7.4がWordPressVIPプラットフォームのPHPのデフォルトバージョンになっています。 ただし、PHP 7.4は2022年11月にセキュリティサポートが終了するため、強力なセキュリティを維持するためにWordPressサイトをアップグレードする必要があります。 このため、WordPress VIPプラットフォームは、すべてのお客様のアプリケーションをPHP8.0で実行するように移動します。

以下は、変更の説明と、他のプラットフォームでWordPressを使用しているお客様と他のユーザーの両方が準備するために実行できる手順です。

目次

  • PHP8.0のストーリー
    • 新機能
    • PHPおよびWordPressコミュニティ全体でのサポートの急増
  • PHP8.0の互換性の問題を見つける方法
    • PHPCompatibility標準でPHP_CodeSnifferを使用する
    • PHP8.0でのPHPの致命的なエラーである既知のPHP警告に対処する
    • 自動テストを作成する
    • PHPStan/Psalmまたは別の静的分析ツールを使用する
  • WordPressVIPでPHP8.0を使い始める方法
    • アプリケーションをローカルで実行する
    • プルリクエストでVIPコード分析ボットを確認する
    • WordPressVIPアプリケーションでPHP8を有効にする
    • プロアクティブなヘルプを活用する
  • PHP 8.1はどうですか?

PHP8.0のストーリー

2020年11月にリリースされたPHP8.0は、新しいコード(およびより短いコード)をバグに対してより回復力のあるものにするいくつかの拡張機能と機能を提供しました。

ほとんどの開発者は、PHP8.0に大きなメリットがあります。 ただし、メジャーバージョンとして、いくつかの重大な変更が含まれています。 これにより、たとえばPHP7.3からPHP7.4への変更よりも、PHP7.4からPHP8.0への切り替えが難しくなります。 具体的には、コアPHPに49の重大な変更があり、コードが依存する可能性のあるライブラリや拡張機能を含め、PHP8全体で169の変更がありました。

幸いなことに、組織がPHP 8.0に移行すると、2023年11月までコアPHPプロジェクトからセキュリティサポートを受けることになります。それ以降、組織はPHP 8.1にアップグレードする必要があります。マイナーリリースでは、はるかに小さな変更が必要です。

新機能

PHP 8.0は、1)エッジケースと不整合を修正して、PHPをより堅固で予測可能なスクリプト言語にし、2)言語全体を改善するための新機能を提供するように設計されました。 これらには、次のようないくつかの新しい構文が含まれています。

  • 厳密に型指定されたコード(たとえば、共用体型、 static型とmixed型、 Stringableインターフェイス、数値の処理の変更など)を簡単に記述できるようにします。
  • 維持する必要のあるコードの量を減らします。たとえば、nullsafe演算子、コンストラクタープロパティの昇格、 match演算子、キャプチャーしないキャッチなどです。
  • オブジェクトの::classの許可、パラメーターリストの末尾のコンマ、 str_contains()str_starts_with() 、およびstr_ends_with()関数、式のスロー、属性などのコードを簡略化します。

名前付きパラメーターも含まれます。 ただし、WordPressコアはこの機能との互換性を主張していないことに注意してください。 したがって、名前付きパラメーターを使用して独自のカスタム関数を呼び出すことはできますが、WordPress関数を呼び出さないでください。パラメーター名は、将来警告なしに変更される可能性があります。

PHPおよびWordPressコミュニティ全体でのサポートの急増

新しい構文を含む新しいバージョンのPHPがリリースされるたびに、新しい構文がPHPおよびWordPressコミュニティ全体でサポートされるまでに時間がかかります。

PHP開発者ツール

Composer、PHPUnit、PHP_CodeSniffer、PHPStan、Xdebug、およびさまざまなIDEなどのPHP開発ツールはすべて、新しいバージョンのPHPの新しい構文を認識する必要があります。 PHPは継続的に開発されていますが、新しいバージョンの完全なエコシステムが利用可能になるまでに時間がかかる場合があります。 ただし、多くの場合、事前に利用可能になっているアルファベータ、およびリリース候補のリリースに基づいて開発作業が行われているため、最終リリースの準備が整うまでにツールを使用できるようになります。 これらすべてのツールとその他のツールがPHP8.0をサポートするようになりました。これにより、PHPコードの開発、特にWordPressの開発に適しています。

WordPressコア

次に、WordPressコアはPHP8.0をサポートする必要があります。 WordPressプロジェクトには、リリースされるまでに新しいバージョンのPHPとの互換性の長い歴史があります。 Make WPに関するこのよく書かれた投稿によると、WordPressは2020年12月のWordPress 5.6リリース以来、PHP 8.0との「ベータ互換性」を持っています。「ベータ互換性」とはどういう意味ですか? つまり、WordPressはPHP 8.0で正常に実行できますが、WordPressコアファイルで厳密な型を宣言したり、WordPressコア関数で名前付きパラメーターを使用したりするなどの機能はサポートされていません。

WordPressVIPプラットフォーム

WordPress VIPプラットフォームは、2022年5月からPHP 8.0(およびPHP 8.1)をサポートしており、プラットフォームが企業のニーズを満たすことを可能にするプラグインと機能のスイートを含みます。

サードパーティのプラグイン

WordPressには数万のプラグインがあり、PHP8.0のサポートレベルは大きく異なります。 たとえば、新しく予約された単語がプラグインによって引き続き使用されている場合や、PHPネイティブ関数に渡されるパラメーターが現在期待されているタイプではない場合があります。 そのため、サードパーティのプラグインは、PHP8.0との非互換性がアプリケーションに影響を与える可能性がある領域の1つである可能性があります。

以下では、これらの非互換性のいくつかをチェックする方法を学ぶことができます。 オプションには、上流の個人/チームに修正を行って新しいリリースを作成するように依頼するか、社内の開発チームまたは注目のパートナーの1つなどの代理店にプラグインをフォークして、自分で修正を行うように依頼することが含まれます。

カスタムプラグイン

WordPress VIPプラットフォームのほぼすべての顧客は、1つ以上のカスタムプラグインを使用しています。 サードパーティのプラグインと同様に、互換性も確認する必要があります。 発見された問題に対処するように元の開発者に依頼することは、一般的に最善の行動です。

サードパーティまたはカスタムテーマ

プラグインが互換性の問題の原因である可能性が最も高いですが、サードパーティおよびカスタムテーマもPHP8.0と互換性がある必要があることを忘れないでください。 プラグインコードの互換性をチェックする同じアプローチがテーマコードに適用されます。

PHP8.0の互換性の問題を見つける方法

開発チームがコードをレビューして互換性の問題を判断するために使用できる主なアプローチは4つあります。

  1. PHPCompatibility標準でPHP_CodeSnifferを使用します。
  2. PHP8.0でのPHPの致命的なエラーである既知のPHP警告に対処します。
  3. 自動テストを作成します。
  4. PHPStan/Psalmまたは別の静的分析ツールを使用します。

PHPCompatibility標準でPHP_CodeSnifferを使用する

PHP_CodeSniffer(PHPCS)は、PHPファイルをトークン化し、定義された一連のコーディング標準の違反を検出します。 WordPressコーディング標準と独自のVIPコーディング標準(お客様に使用をお勧めします)のパッケージがあります。

PHPCompatibilityおよびPHPCompatibilityWPと呼ばれるパッケージもあり、これらの標準は、PHPのバージョン間の互換性についてコードベースを分析します。

結果はツールの機能と準備に依存するため、バージョン10がリリースされるまで、PHPCompatibilityのdevelopブランチを使用することが不可欠です。 バージョン10には、PHP 8.0(およびPHP 8.1)の互換性に関連するスニフが含まれます。 developブランチを使用するように構成をセットアップする方法については、ドキュメントを参照してください。 バージョン10がリリースされると、代わりにそのバージョンを使用できます。

PHPCompatbilityWPパッケージは、PHPCompatibilityパッケージの上に構築されますが、WordPressコアに含まれる下位互換性アイテムのチェックをいくつかオフにします。

PHPCSとPHPCompatibility/PHPCompatibilityWPを設定すると、次のチェックを実行できます。

 phpcs --standard=PHPCompatibilityWP --severity=1 --runtime-set testVersion 8.0- --extensions=php <path-to-code>

<path-to-code>は、小規模から始めたい場合は単一のカスタムまたはサードパーティのプラグインまたはテーマにすることができ、調査と対処が必要なすべての違反を確認したい場合はリポジトリ全体にすることができます。

スキャン手順では、PHPバージョンの互換性の問題(実行時の値のタイプが正しくないなど)がすべて検出されるわけではありませんが、構文に関連する最も一般的な問題を特定するのに役立ちます。

PHP8.0でのPHPの致命的なエラーである既知のPHP警告に対処する

PHP 8.0では、いくつかの再分類されたエンジン警告が発生し、警告は致命的なエラーおよびTypeError例外になりました(一部の通知は警告になりました)。 PHP7.4で検索するPHP警告テキストは次のとおりです。

  • Attempt to assign property '*' of non-object
  • Attempt to modify property '*' of non-object
  • Attempt to increment/decrement property '*' of non-object
  • Creating default object from empty value
  • Cannot use a scalar value as an array
  • Cannot add element to the array as the next element is already occupied
  • Cannot unset offset in a non-array variable
  • Only arrays and Traversables can be unpacked
  • Invalid argument supplied for foreach()
  • Illegal offset type
  • Illegal offset type in isset or empty
  • Illegal offset type in unset
  • Cannot assign an empty string to a string offset
  • Division by zero
  • Use of undefined constant *

これらの警告を修正することは、アプリケーションがPHP8.0と互換性を持つために不可欠です。

注:PHP 8.0には他にも致命的なエラーがありますが、PHP7.4では警告すらありませんでした。 例は次のとおりです。

  • コンストラクターを除いて、プライベートメソッドをfinalとして宣言することはできません。
  • マジックメソッドの署名が無効です。
  • 抽象特性メソッドの署名検証
  • parent::を親クラスで使用します。
  • 互換性のないオーバーロードされたメソッドシグネチャ(リスコフの置換原則)

これらの既知の変更に対処することから始めるのが良いでしょう。 TypeErrorは、厳密な型チェックが宣言されていない場合でも、たとえば無効なパラメーター型が渡された場合など、すべての内部PHP関数に対して一貫してスローされます。

また、 @演算子は、PHP8.0で致命的なエラーを無視しなくなることに注意してください。

当然、アプリケーションは理想的にはエラー、警告、通知を生成しないはずです。 見つけたものに対処することをお勧めします。 たとえば、8.xでの一部のPHP警告は、PHP 9.0で致命的なエラーになり、PHP8.xで誤ったロジックが発生する可能性があります。 このような問題や開発中に「発見を逃れる」問題を修正するために、リリース前とリリース後の開発時間を組み込むことがベストプラクティスです。 また、サイトの安定性への投資であり、関連する機能の受け入れ基準を正確に満たす能力です。

自動テストを作成する

自動テストにはさまざまな種類がありますが、ここでは次のことを意味します。

  • 単体テスト-WordPressで定義された関数またはクラスをモックし、テストを実行するためにデータベースのインスタンスを使用できるようにする必要はありません。
  • 統合テスト— WordPressをロードし、実際のテストデータベースを使用します

このトピックは大きすぎてここでは十分にカバーできませんが、考慮すべきことがいくつかあります。

  • 結果は、テストスイートの完全性によって異なります。 多くのテストがない場合は、互換性を確保するために必要なカバレッジが不足します。
  • 厳密なアサーションを使用します。 たとえば、 assertEquals()を使用すると大まかな比較が行われますが、 assertSame()は型もチェックします。
  • 厳密なコードカバレッジを使用します。 beStrictAboutCoversAnnotations=”true”およびforceCoversAnnotations=”true”をPHPUnit構成ファイルに追加し、 @coversアノテーションを使用して、テスト全体の国際コードカバレッジの正確なレベルを見つけます。
  • 幸福(期待される入力に基づく動作)および不幸(予期しない入力に基づく動作)パスをテストして、関数が期待どおりに失敗することを確認します。これは、最も厳密性に関連する問題が発生する場所です。
  • PHP8.0でテストを実行します。 統合(WordPress)テストでは、2021年にWordPressコアテストスイートに変更が加えられ、PHP8.0をサポートする新しいバージョンのPHPUnitを使用してロックが解除されました。 これは、PHPUnit Polyfills、Brain MonkeyおよびMockeryのサポート、WordPress関数の追加の関数スタブ、コンテンツ作成のファクトリメソッドなどのすべてのWPネイティブテストユーティリティへのアクセスを含むWPTestUtilsパッケージによってサポートされます。
  • 互換性の変更が成功したことをより確信できるように、修正を試みる前にテストを作成することを検討してください。

PHPStan/Psalmまたは別の静的分析ツールを使用する

PHPCSはいくつかの非互換性をキャッチしますが、PHPCSがキャッチするように設計されていない実行時の変更がいくつかあります。 見逃される可能性のある1つの例は、パラメーターとして渡すことができるタイプをより厳密にするネイティブPHP関数です。

ここでは、PHPStan、Psalm、または別の静的分析ツールなどのツールが役立ちます。 ただし、最も効果的にするには、コードベースで厳密な型(コード内のパラメーター型と戻り型)を使用するか、正しく文書化する( @return@param行と@return行)必要があります。

これらのツールには通常、最低レベルの問題を最初に修正し、次にツールをさらに統合してコードベースの品質を向上させることができるルールレベルがあります。

phpstan-wordpressやpsalm-plugin-wordpressなどの拡張機能を使用して、WordPressコアコードのタイプに関する知識を追加できます。

構成が完了すると、実行ごとに予期しない型を関数に渡す場所が強調表示され、致命的なTypeError例外がスローされる可能性があります。 これらのそれぞれを修正する必要があります。

多くの場合、try-catchブロックまたは型キャストを使用することで、TypeError例外を抑制できる場合があります。 ただし、使用しないことを強くお勧めします。 根本原因を修正すると、コードがより強力になり、脆弱性が低くなり、エラーが発生しやすくなり、長期的にはほとんどの場合、成果が得られます。

WordPressVIPでPHP8.0を使い始める方法

アプリケーションをローカルで実行する

アプリケーションのインスタンスをローカルで実行することは、互換性の問題を検出して修正できるようにするための賢明な最初のステップです。 任意のローカル開発環境を使用できますが、WordPress VIPプラットフォームとの最高の同等性を確保するために、VIPローカル開発環境をお勧めします。 コマンドvip dev-env create --php=8.0 (VIP-CLI 2.9.5以降を使用)を実行し、セットアップウィザードの残りの部分を完了すると、アプリケーションはPHP8.0でローカルに実行されます。

プルリクエストでVIPコード分析ボットを確認する

wpcomvip組織の下でリポジトリに対して行われたプルリクエストを見ると、PHPCS、PHPリンティング、およびSVGリンティングに関するフィードバックを提供するVIPコード分析ボットが表示されます。

PHPリンティングのステップでは、ボットは、リポジトリがデプロイされるアプリケーションに使用される任意のバージョンのPHPでPHPコードをリントします。 そのバージョンがPHP7.4の場合、次の切り替えに備えて、PHP8.0も使用して自動的にリントします。

WordPressVIPアプリケーションでPHP8を有効にする

ローカルでできる限り多くのチェックと修正を行ったら、WordPressVIPアプリケーションでPHP8.0を有効にします。 実稼働環境に移行する前に、最も低い環境から開始し、すべてが良好に見えることを確認します(vip-cliを介したPHPログまたはVIPダッシュボードのヘルスログを含む)。

環境でPHP8.0を有効にするには、Zendeskチケットを開いて、有効にするアプリケーションと環境をお知らせください。

チケットを開かなくてもPHPのバージョンを変更できるようにするために、VIPダッシュボードに新機能がまもなくリリースされます。 常にロビーで最新情報を確認してください。

プロアクティブなヘルプを活用する

プレミア顧客のアカウントチームは、すでに顧客に連絡を取り、どのように顧客をサポートできるかについて話し合っています。 PHPCSから結果が送信され、これらのチェックを自分で実行する方法についてのガイダンスが提供されます。 致命的なエラーとなるPHPの警告も強調表示され、非互換性への対処に有利なスタートを切ることができます。

PHP 8.1はどうですか?

WordPressVIPプラットフォームはPHP8.1もサポートしています。 PHP8.0とPHP8.1の間の変更は、PHP 7.4と8.0の間の変更よりも少ないため、対処する非互換性が少なくなるはずです。

PHP 8.1:

  • PHPコア開発者から2023年11月まで積極的にサポートされ、セキュリティサポートは2024年11月まで行われます。
  • PHP8.0よりも多くのリクエストを1秒あたりに処理できます。
  • WordPress 5.9以降で「ベータ互換性」をサポートしています。これは、PHP 9の準備中にいくつかの非推奨の通知があることを意味しますが、WordPressコアの動作には影響しません。

厳密に型指定されたコードの使用や自動テストの追加など、PHP 8.0に必要な便利な変更は、PHP 8.1のロールアウト、WordPress 6.1、6.2、6.3以降のアップグレード、および実行する機能リリースに役立ちます。 多くの場合、QAプロセスがボトルネックになるため、概説したツールとアプローチのいくつかを使用すると、手作業を削減し、これらの変更を展開する際の自信を高めることができます。

PHP 8.0について質問がある場合は、チケットを開いてください。