PHPは定期的にバージョンアップしています。
その都度一部仕様が変更になり、今までOKでも、バージョンアップ後エラーになるということがしばしばあります。
今回も、PHP5.6の頃に制作したPHPプログラムを、PHP7.4で動かしてみたらエラーが発生しました。
こういったときはいつも、「なんでだろう?」
と思いつつひとつづず調べていきます。
今回も対処できましたので忘備録として記録いたします。
現象はこのような感じです。
Notice: Trying to access array offset on value of type null in
PHP7.4から、このようなエラーが出るようになりました。
PHPのバージョンアップは仕方ないですが、昔OKな記述が急にエラーになると、修正が必要です。
早速原因を調べました。
原因は空の配列参照
今回のエラーは、以下のソースで発生します。
<?php
$value = null;
var_dump($value["test"]);
?>
$valueは変数ですが、配列ではありません。
ただの変数を、配列のように参照すると今回のエラーになります。
このように記述すればエラーになりません。
<?php
$value = array("test"=>null);
var_dump($value["test"]);
$value を「array」を使って配列を宣言しておくことでエラーになりません。
ちなみにこのような宣言はエラーになります。
<?php
$value = array();
var_dump($value["test"]);
?>
$valueを配列宣言していますが、メンバ名「”test”」がない場合エラーになります。
ちなみに「Notice: Undefined index: test in」エラーになります。
PHP7.4以降では、配列のメンバ名を事前指定しないといけないことがわかりました。
配列のメンバ名が流動的な場合は次のような記述が有効です
メンバ名がプログラム上流動的(メンバ名があったり、なかったりする)場合は、事前指定ができません。
ほっておくと、エラーで止まる場合が発生します。
その場合は以下のような記述で回避します。
<?php
$value = null;
if (isset($value["test"]) == true)
{
var_dump($value["test"]);
}
?>
isset()関数は配列メンバ名が存在するか、しないかを判定してくれます。
isset()の中で存在しない配列メンバ名を指定してもエラーにはなりません。
そこでisset()関数で存在する配列メンバ名であれば、処理を行うとしておけば、エラーを回避できます。
■isset()について
判定したい変数を()の間に記述する。
存在する場合・・・tureが返ります。
存在しない場合・・falseが返ります。
今回は結構初歩的なことで解決できました
PHPでエラーが発生時、エラーメッセージにプログラムの発生個所が表示されます。
その部分の文法エラーを探せばたいてい何とかなります。
ただ今回は、昔動いていたプログラムがエラーになる現象です。
昔は文法エラーでなかったものが、今回から文法エラーとなるため、まず何がいけないのかを知ることから始めます。
今後このようなエラー発生が増えてゆくと思われます。
プログラム制作者として、ひとつひとつが良い経験になります。
※今回isset()関数でチェックしましたが、isset()はメンバ名が存在していても中身がNULLだとfalseになります。メンバ名のみの存在確認をするには別の関数が有効です。
詳しくはこちらに記載しています。