WordPressのバージョンが5.3になりPHP7.4に対応しました。また、PHPの最小バージョンも上がり(5.6.20)、WordPressのPHP動作環境が変わっています。
WordPress公式ガイドの全内容を和訳して解説します。
サポート終了のPHPバージョンについて
まず最初に、話の中心になるPHPのバージョンについて。
WordPress5.3の対象PHPバージョンはすでにサポートが終了してるものがります。
PHP バージョン | サポート 終了日 |
---|---|
7.4 | 2022/11/28 |
7.3 | 2021/12/6 |
7.2 | 2020/11/30 (終了) |
7.1 | 2019/12/1 (終了) |
7.0 | 2019/1/10 (終了) |
5.6.40 ・ ・ ・ | 2018/12/31 (終了) |
5.6.20 | (終了) |
けっこう広範囲をカバーしてますが、じっさいは上位の2つ以外、サポートが切れているんですね?
WordPressのドキュメントでも『7を強くおすすめします。』と言っています。
(別のところでは7.3以上を推している。)
(書いてある内容から7.3以上が正しい。)
WordPress5.3からPHP最小バージョンが5.2.6 -> 5.6.20に上がりました。
いまは、WordPress5.2のPHP最小バージョンも5.6.20です。
WordPress5.3では新たにPHP7.4に対応しました。このへんをふまえてPHPがらみの変更点を見ていきましょう。
今回は、公式ガイドのPHP 7.4 & Code Modernization(PHP7.4とコードの近代化)の全内容をかいつまんで解説します。
(公式ガイドは英語です。)
今回の内容は、プラグイン・テーマ開発者向けです。一般ユーザーの人はご参考程度に...ならないかも。
WordPressが公表しているサーバー要件の実態です。
半分ちかくはサポート切れのPHPバージョンを使っています。
『WordPressはセキュリティが甘い』といわれる理由でしょう。
執筆時点(2019/12/14)よりも状況はさらに進んでいます。
WordPressのバージョンは半分が5.4以上になっていますが、PHPのバージョンは7.2以下が半分以上。
これに問題意識を持っているのがアナウンスでも分かります。これからもPHPの最小バージョンの引き上げは積極的に行われるでしょう。
(2020/11/20 追記。)
WordPressとPHP7.4
PHP7.4では多くの変更点がありますが、WordPressでの対応は少しだったようです。
配列で中括弧構文は使わない!
phpの配列では中括弧が使えます。
しかしこれを使うのはやめましょう。次期バージョンのPHP8では削除することがすでに発表されており、php7.4では非推奨です。
残すメリットはありません。
(WordPress5.3のコア機能は修正しています。)
$array = [1, 2];
echo $array[1]; // prints 2
echo $array{1}; // ダメ!
$string = "foo";
echo $string[0]; // prints "f"
echo $string{0}; // ダメ!
implode()のパラメータ順序
implode()は、配列を区切り文字で文字列に変換するものです。
$arr = ['aaa', 'bbb', 'ccc'];
echo implode(',', $arr); // "aaa,bbb,ccc"
これまで、パラメータの順序に決まりはありませんでした。これでも同じ結果になります。
$arr = ['aaa', 'bbb', 'ccc'];
echo implode($arr, ','); // "aaa,bbb,ccc"
次期バージョンphp8ではパラメータの順不同は禁止されることになっていて、php7.4は非推奨です。
(ログに警告(E_DEPRECATED)が出ます。)
正解はこっちです。(ドキュメントの順序にしたがう。)
$arr = ['aaa', 'bbb', 'ccc'];
echo implode(',', $arr); // "aaa,bbb,ccc"
implode()のエイリアスjoin()も同じです。
配列でない値の配列アクセス
PHPの配列アクセスは、ゆるーいところがあります。
$arr = false;
echo $arr[0] // エラーでない
例えば、関数の戻り値で array | falseを返すものは、falseを気にしない書き方ができました。
function sample($val) {
if($val === 'aaa') return false;
return [1, 'val'];
}
$arr = sample('aaa');
echo $arr[0]; // falseなのに配列アクセス
$arr = sample('bbb');
echo $arr[0]; // 正常な配列アクセス
php7.4ではログに警告(E_DEPRECATED)が出るので、正解のコードの書き方はこうなります。
function sample( $val ) {
if( $val === 'aaa' ) return false;
return [1, 'val'];
}
// falseか配列ならこれでもいい。
$arr = sample( 'aaa' );
if( $arr !== false ) {
echo $arr[0];
}
// 配列を期待するならこれもあり
$arr = sample( 'bbb' );
if( is_array( $arr ) ) {
echo $arr[0];
}
// これもあり。
$arr = sample( 'ccc' );
if( !is_array( $arr ) ) return;
echo $arr[0];
配列アクセスができなくなる型
null
bool
int
float
resource
演算子の優先順位(. + -)
PHPでは、文字列連結の演算子(.)と数式の演算子(+, -)の優先順位は同じで、式は左から順に実行します。
echo '3' . '5' + '7'; // 42
echo '3' + '5' . '7'; // '87'
echo '3' . '5' - '7'; // 28
echo '3' - '5' . '7'; // '-27'
これが『直感的じゃない』、ボクの勝手な表現で『ややこしい』ので、PHP8では数式(+, -)よりも連結(.)の演算子の優先順位が低くなります。
そこでphp7.4では、(.)と(+, -)が混在して(.)が前に出てくる式は、括弧(( ))がないと警告(E_DEPRECATED)が出ます。
// php7.4: 同じ結果(42)。ただし警告
// php8: 値が変わる(312)
echo '3' . '5' + '7';
// 警告を直すには(php8でも値は同じ)
echo ('3' . '5') + '7';
// php7.4: 同じ結果(87)。警告なし
// php8: 同じ結果(87)
echo '3' + '5' . '7';
// php7.4: 同じ結果(28)。ただし警告
// php8: 値が変わる('3-2')
echo '3' . '5' - '7';
// 警告を直すには(php8でも値は同じ)
echo ('3' . '5') - '7';
// php7.4: 同じ結果(-27)。警告なし
// php8: 同じ結果(-27)
echo '3' - '5' . '7'; // '-27'
マジッククォートの残骸削除
php5.3で非推奨、5.4で削除されたマジッククォートの残っていた関数がphp8で削除されます。
get_magic_quotes_gpc()
get_magic_quotes_runtime()
php5.4以降、つねにfalseを返すのですでに意味がありません。php7.4では警告(E_DEPRECATED)が出ます。
三項演算子のネストに優先順位の括弧をつける
三項演算子のネストは優先順位の括弧(( ))をつけないといけなくなりました。
括弧をつけないと警告(E_DEPRECATED)が出ます。
三項演算子のネストは読みにくいのでかなり昔に捨てました。
(個人の意見です。でも意外と使うのを嫌う人は多い。新人の頃によく注意された。)
説明がないのは忘れたから。
(正直、この話も興味ない。)
気になる人は『三項演算子 ネスト』などでググってみてください。
使ってなくても、将来バグになる可能性があることは覚えておきましょう。
自動チェックツール
配列アクセス意外は、チェックツールで自動検知できます。これを使ったほうが早いです。
(composerでインストールします。)
外部ライブラリとの依存関係
php7.4に対応するため外部ライブラリの依存関係も更新しました。
(外部ライブラリのバージョンアップ)
getID3
配列の中括弧の修正とマジッククォート関連の削除。その他。
PHPMailer
マジッククォート関連の警告を出力しないパッチの適用。その他。
PMPMailer6ではマジッククォート関連が削除されている。WordPress5.4のどこかで当てる予定。それまでの暫定措置。
Requests
配列の中括弧構文対応と配列アクセスの修正。その他。上げたバージョンアップの番号は不明。
SimplePie
implode()の警告を出力しないパッチを適用。
v.1.5.3では修正されている。それまでの暫定措置。WordPress5.4のどこかで当てる予定。
その他
POP3
コードの近代化
WordPress5.3では、PHPの最小バージョンが5.6.20になりました。古いコードの変更や削除を行い、パフォーマンスの向上やコーディングしやすいようにしています。
スプレッド演算子の導入
スプレッド演算子は、関数のパラメータに『...』を使って、複数のパラメータを一気に指定するものです。
PHP5.6で追加された新機能で、いままでWordPressのPHP最小バージョンが5.2系だったので対応できませんでした。
WordPres5.3でPHP5.2系はいらなくなったので本格的に導入しました。
function f($req, $opt = null, ...$params) {
// $params は配列で、残りのすべての引数が含まれる
printf('$req: %d; $opt: %d; パラメータ数: %d'."\n",
$req, $opt, count($params));
}
f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
$req: 1; $opt: 0; パラメータ数: 0
$req: 1; $opt: 2; パラメータ数: 0
$req: 1; $opt: 2; パラメータ数: 1
$req: 1; $opt: 2; パラメータ数: 2
$req: 1; $opt: 2; パラメータ数: 3
function add($a, $b, $c) {
return $a + $b + $c;
}
$operators = [2, 3];
echo add(1, ...$operators);
6
スプレッド演算子は処理パフォーマンスが向上し速いです。それが導入の目的。
既存テーマ・プラグインへの影響
まず、ほとんどのテーマ・プラグインは影響ありません。ただし、次のクラス・メソッドを拡張しているものは影響します。
影響を受けるクラスリスト
- Walker
Methods: - WP_User
Methods: - wpdb
Methods: - _WP_Dependency
Methods: - Automatic_Upgrader_Skin
Methods: - Bulk_Upgrader_Skin
Methods: - WP_Ajax_Upgrader_Skin
Methods: - WP_Upgrader_Skin
Methods:
影響を受けるテストクラスのリスト
- WP_UnitTestCase_Base
Methods:- assertQueryTrue() – Patch
- MockAction
Methods:- filterall() – Patch
- Tests_WP_Customize_Manager
Methods:- capture_customize_post_value_set_actions() – Patch
- Tests_WP_Hook_Do_Action
Methods:- _action_callback() – Patch
影響があるときの対応
追加パラメータを使うときはPHP5.6以上でないといけません。公式ガイドでは、readme.txtに最小バージョン5.6を書くように言っています。
ちなみに、追加パラメータを使ったテーマ・プラグインはWordPress5.3より前のバージョンで動きます。
WordPressの下位互換性あり。処理内で追加パラメータを使わないだけ。
ただし、さっきのリストのメソッドをオーバーライドしているときは要注意。
テーマ・プラグインの対象バージョンをWordPress5.3以降にするか、以前のバージョンをサポートするか決めないといけません。
オーバーライド・メソッドをWordPress5.3以降に対応するには、メソッドのパラメータ変更が必要です。
(スプレッド演算子のパラメータ追加。)
WordPress5.3以前のバージョンをサポートするなら、追加パラメータを使わない処理が必要でしょう。
(バージョンごとに処理を分けるなど。)
テーマ・プラグインを更新しないといけないか?
WordPress5.3以前から提供されているテーマ・プラグインは、5.3でも修正しないで動きます。しかし、関数シグネチャ(パラメータの不一致)の警告が出ます。
ログが汚くなるので修正したほうがいいでしょう。
(ただし、優先順位はそう高くない。とりあえず動くので。)
ネイティブJSON拡張は必須
PHP5.2以上はデフォルトで使えるので気にしなくていいです。2006年リリースなのでほぼ無関係でしょう。
json_encode()を当たり前に使っている人にはどうでもいいです。
WordPressのコア機能には、ネイティブJSON拡張がインストールされていないPHPのために、回避策、機能、ポリフィルが残っていました。
(ポリフィルは、不足している関数を用意してあげること。たとえばjson_encode()。)
2011年に削除する予定でしたが、世界中に意外とネイティブJSON拡張がないPHP環境が多かったようでできませんでした。
8年もたったいま、やっと削除できる環境になったようです。
(2006年から13年も経って『今ですか?』とも思うが。)
WordPress5.3へのアップデートのキャンセル
もし、PHP環境にネイティブJSON拡張がないとき、WordPress5.3へのアップデートを行うと、処理をキャンセルします。
(もとのバージョンのまま。)
そんな人はほぼいないと思いますが。
変更の概要
あまり必要ないですが変更点の概要です。
非推奨
次の関数やクラスを使うと警告ログが出ます。
(将来の削除が決まっているので。)
wp-includes/class-json.phpにあるクラスとそのメソッド。
(Services_JSON, Services_JSON_Error)
削除
いらなくなった関数、変数、定数を削除しました。
json_encode() - phpにある
json_decode() - phpにある
json_last_error_msg() - phpにある
JsonSerializable - phpにある
$wp_json
JSON_PRETTY_PRINT - phpにある
JSON_ERROR_NONE - phpにある
ほとんどはphpに定義されているのでいらなくなったものです。見慣れたものもありますね?
(json_encode(), json_decode()まで用意されていたとは...)
残したもの
wp_json_encode()は残すみたいです。json_encode()する前に、JSONの構文チェックをするので、むしろ『使ってください』だそうです。
(何も考えずにjson_encode()使ってた...。知らなかったよ😢)
まとめ
WordPress5.3は、PHP7.4に対応したこと、PHP最小バージョンを5.6系に上げたことで、いつもよりもPHPがらみの変更点が多いです。
でも、PHP7.4の変更点からすれば大したことないです。PHP7.4についてはこちらをどうぞ。
(今回紹介したPHP7.4のこと以外にもたくさんあります。)
また、WordPressの下位互換はあると言ってますが、バージョンの低いWordPressはとくに、いきなりPHPのバージョンを上げるのは危険です。
テスト環境などを作って十分に検証してから上げましょう。
コメント