ホームページ制作 オフィスオバタ

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な記述が急にエラーになると、修正が必要です。
早速原因を調べました。

原因は空の配列参照

今回のエラーは、以下のソースで発生します。

<?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になります。メンバ名のみの存在確認をするには別の関数が有効です。
詳しくはこちらに記載しています。

モバイルバージョンを終了