PHP Notice: Trying to access array offset on value of type null in に対処

2022年3月14日

PHPは定期的にバージョンアップしています。
その都度一部仕様が変更になり、今までOKでも、バージョンアップ後エラーになるということがしばしばあります。

今回も、PHP5.6の頃に制作したPHPプログラムを、PHP7.4で動かしてみたらエラーが発生しました。

こういったときはいつも、「なんでだろう?」
と思いつつひとつづず調べていきます。

今回も対処できましたので忘備録として記録いたします。

現象はこのような感じです。

Notice: Trying to access array offset on value of type null in

PHP7.4から、このようなエラーが出るようになりました。
PHPのバージョンアップは仕方ないですが、昔OKな記述が急にエラーになると、修正が必要です。
早速原因を調べました。

原因は空の配列参照

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

$valueは変数ですが、配列ではありません。
ただの変数を、配列のように参照すると今回のエラーになります。

このように記述すればエラーになりません。

$value を「array」を使って配列を宣言しておくことでエラーになりません。

ちなみにこのような宣言はエラーになります。

$valueを配列宣言していますが、メンバ名「”test”」がない場合エラーになります。
ちなみに「Notice: Undefined index: test in」エラーになります。

PHP7.4以降では、配列のメンバ名を事前指定しないといけないことがわかりました。

配列のメンバ名が流動的な場合は次のような記述が有効です

メンバ名がプログラム上流動的(メンバ名があったり、なかったりする)場合は、事前指定ができません。
ほっておくと、エラーで止まる場合が発生します。

その場合は以下のような記述で回避します。

isset()関数は配列メンバ名が存在するか、しないかを判定してくれます。
isset()の中で存在しない配列メンバ名を指定してもエラーにはなりません。

そこでisset()関数で存在する配列メンバ名であれば、処理を行うとしておけば、エラーを回避できます。

■isset()について
判定したい変数を()の間に記述する。
存在する場合・・・tureが返ります。
存在しない場合・・falseが返ります。

今回は結構初歩的なことで解決できました

PHPでエラーが発生時、エラーメッセージにプログラムの発生個所が表示されます。
その部分の文法エラーを探せばたいてい何とかなります。

ただ今回は、昔動いていたプログラムがエラーになる現象です。
昔は文法エラーでなかったものが、今回から文法エラーとなるため、まず何がいけないのかを知ることから始めます。

今後このようなエラー発生が増えてゆくと思われます。
プログラム制作者として、ひとつひとつが良い経験になります。

※今回isset()関数でチェックしましたが、isset()はメンバ名が存在していても中身がNULLだとfalseになります。メンバ名のみの存在確認をするには別の関数が有効です。
詳しくはこちらに記載しています。

今回のレポートは以上です。
読んでいただいてありがとうございました。


ホームページに関するお悩み事やご相談事がございましたら私どもまでご連絡ください。 鋭意ご対応申し上げます。
ホームページのご提案もさせていただいております