PHP7.4→8.1にしたときに出たPHPの警告への対応(メモ)

公開日:2022(令和4)年12月9日/最終更新日:

WordPress plugin Hima Art UtilityWordPress Customize Ideas | Personal WP Customization Notes (PWCN)

【景品表示法に基づく表記】ページ内のコンテンツには、商品プロモーションが含まれています

当サイトで配布している【Hima Art Utility】プラグイン。WordPressのパフォーマンス自体には影響がないという認識で、PHP7.4の環境で作ってきました。

でもサーバーによっては、デフォルトのPHPバージョンが8.0もしくは8.1になっていて、PHPのバージョンのことなど知らずにWordPressを自動インストールするケースも増えるでしょうということで、環境をPHPバージョン8.1へ変更しました。

すると、表立ってエラーで動作しないということはありませんでしたが、PHP7.4では出なかった警告がいくつか出ましたので、対応しました。

そこで今回は、自作テーマや自作プラグインで同じようなケースがあった場合に自身で対応できるよう、メモとして対応方法を紹介しておきます。

PHP8.1で発生する警告への対応方法(例)

PHP Warning: Undefined variable $〇〇 in…

これは、$〇〇の変数が使われていますが、きちんと定義されていませんよ!という警告です。

大抵の場合は、1つのプログラム(function)の中で、コードを省略するために使用した変数(今回の場合は「$image_alt」)の規定値が設定されていないですよ!という意味のようです。

コード例を挙げると、【Hima Art Utility】プラグインのプログラムの中に以下の記述があり、警告になっていました。

$image_alt = get_the_title($post->ID);

これを以下のように、変数に何かの値があったら..という条件を追加することで、警告は出なくなります。

if(isset($image_alt)){
$image_alt = get_the_title($post->ID);
}

要するに「値がなかった場合はどうすんの?」と言われてるということです。PHPのバージョンアップで厳格になったということなんですね。

また、そもそも値がなかったら..ということなので、先に空文字を予め指定する、条件分岐であればなかった場合の対処を確実に書くといった対応が有効でしょう。

ただし、例えばショートコードパラメーターなどで条件分岐する場合などでは、これでも警告が出続ける場合があります。

これは、isset()という関数が値が存在するかどうかの判断と同時に、空であっても空(true)として処理するからです。

isset()を使って各自に判定させるには「値があるかどうかを判定させるかと同時に、空の場合にはfalseを返すように以下のように書くと解決することがあります。

if (isset($image_alt) && $image_alt !== '') {
$image_alt = get_the_title($post->ID);
}

ケースバイケースですが、「?」演算子を使って確実に分岐させるのも手かも知れません。

$image_alt = get_the_title($post->ID);
$image_set = isset($image_alt) ? $image_alt : '文字列';

先に空文字を予め設定する書き方

同一のユーザー定義関数内にある同じ変数に関しては後から書かれているもので上書きされる性質を利用して、変数の直上に空文字をセットして対処する方法です。

コード例:
$image_alt = ''
$image_alt = get_the_title($post->ID);

本当にケースバイケースですね。

確実に条件分岐を終わらせる書き方

これまではelse(なかったら)というものに対して曖昧だったため、バージョンアップによるPHPの厳格化で警告が出るケースです。

この警告は条件分岐の場合に出ることもあるので、最終的にelseで確実に分岐判定を終わらせることで警告が出なくなります。

例:
if(条件){
$image_alt = get_the_title($post->ID);
}else{
$image_alt = '';
}

参考:PHPでNotice: Undefined variableというエラーが出たとき

PHP Warning: Attempt to read property “〇〇” on null in…

よく似たものに、PHP Warning: Attempt to read property “〇〇” on null in…という警告があり、こちらは、例えば「$post->〇〇」で、〇〇というデータに訪ね当たらなかったので処理できませんというものです。

上記の場合では単純に「global $post;」指定を忘れている場合もあれば、Undefined variable $〇〇 in…と同様に空判定させると解決することが多いです。

ただし、単純に空を!としてしまうと不都合が発生することがありますからよくテストすることが重要です。

詳しくは以下のページで考察と例を含めていろいろ挙げていますので参考にしてみてください。

後述 PHP8.1への変更は早計かも..

Hima Art Utility】プラグイン自体の警告はなくなったのですが、ほかのプラグインでまだ対応しきっていないものもあるようですし、投稿編集画面を開いたときに結構な非推奨項目が出るので、8.1にするのは早計かも知れません。

現在、このサイトはPHP8.0で運営しており、debugをtrueにしてもエラーや警告等の表示は出ませんから、少なくとも【Hima Art Utility】プラグインに関しては8.0までは問題なく使えるようです。


最後に補足として、WordPressを普通に使っていて、突然このようなメッセージが出た!なんとかしなきゃ!と思っている方、そもそもその表示が出てしまうことが問題かも知れませんから、以下のページを参考にしてみてください。

,
Lolipop ServerMoshimo Ad x-serverMoshimo Ad

WordPress Trouble Shooting and Repair | Personal WP Customization Notes (PWCN)
画面上部に「PHP Notice: ob_end_flush(): Failed to send buffer of zlib output compression (0) in…」という表示が出る原因と対処