ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

WordPress5.3, PHP7.4と他のPHPバージョンで気をつけること

wordpress image
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

WordPressのバージョンが5.3になりPHP7.4に対応しました。また、PHPの最小バージョンも上がり(5.6.20)、WordPressのPHP動作環境が変わっています。

WordPress公式ガイドの全内容を和訳して解説します。

サポート終了のPHPバージョンについて

まず最初に、話の中心になるPHPのバージョンについて。

WordPress5.3の対象PHPバージョンはすでにサポートが終了してるものがります。

PHP
バージョン
サポート
終了日
7.42022/11/28
7.32021/12/6
7.22020/11/30
(終了)
7.12019/12/1
(終了)
7.02019/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

v1.9.14からv1.9.18へバージョンアップ。

配列の中括弧の修正とマジッククォート関連の削除。その他。

PHPMailer

v5.2.22からv5.2.27へバージョンアップ。

マジッククォート関連の警告を出力しないパッチの適用。その他。

PMPMailer6ではマジッククォート関連が削除されている。WordPress5.4のどこかで当てる予定。それまでの暫定措置。

Requests

配列の中括弧構文対応と配列アクセスの修正。その他。上げたバージョンアップの番号は不明。

SimplePie

implode()の警告を出力しないパッチを適用。

v.1.5.3では修正されている。それまでの暫定措置。WordPress5.4のどこかで当てる予定。

その他

PemFTP

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

スプレッド演算子は処理パフォーマンスが向上し速いです。それが導入の目的。

既存テーマ・プラグインへの影響

まず、ほとんどのテーマ・プラグインは影響ありません。ただし、次のクラス・メソッドを拡張しているものは影響します。

影響を受けるクラスリスト
影響を受けるテストクラスのリスト

影響があるときの対応

追加パラメータを使うときは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)

_wp_json_prepare_data()

削除

いらなくなった関数、変数、定数を削除しました。

json_encode() - phpにある

json_decode() - phpにある

_json_decode_object_helper()

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のバージョンを上げるのは危険です。

テスト環境などを作って十分に検証してから上げましょう。

前の投稿
WordPress5.3, 管理画面のCSSスタイルの見直し・統一
WordPress5.3, サイトヘルスの変更点と新機能の追加
次の投稿

WordPressの本

post-cta-image

たくさんあるなかで、WordPressの基本が学べる、目的別に学べる本を選びました。

  • WordPressの基本。
  • Webサイト作成から運用まで全体的に学ぶ。
  • かんたんなカスタマイズを学ぶ。
  • 何も分からないところから学ぶ。
  • WordPressからPHPプログラミングを学ぶ。

の5冊です。どうしてもネット上で調べて勉強するのが苦手という人におすすめです。

この内容をモノにすればほかの本は必要ありません。あとは自分の力で、書籍を使わずにインターネット上にある情報だけで学んでいけます。

コメント

コメントを残す

*