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