SE_BOKUのITな日常

SE_BOKUが知ってること・勉強したこと・考えたことetc

PHPの「Warning: Trying to access array offset on value of type null」メッセージ

目次

PHPの「Warning: Trying to access array offset on value of type null」メッセージ

PHPのバージョンをあげると、今まで出力されなかった警告メッセージが表示されるようになった・・という類の話題です。

 

PHP7.4からスルーされなくなったバグ

表示されるようになったと調査依頼がきたのは以下のメッセージです。

Warning: Trying to access array offset on value of type null

翻訳すると。

警告 null 型の値に配列オフセットにアクセスしようとしています。

みたいな感じです。

これは文字通り「null」に対して[0]みたいに配列の添え字で値を取得しようとしている場合に出力されます。

まあ、はっきり言って「バグ」です。

でも、PHP7.3まではメッセージを出力せず、nullを返してスルーされてました。

でも、PHP`7.4ではちゃんと警告メッセージが表示されるようになりました・・とまあ、そういう話です。

このメッセージが表示されたことに、非互換うんぬんで文句言う開発者には「バグなんだから、ちゃんと修正しろ」と言いたいところではあります。

 

相手の型によって微妙にメッセージが変わる

このメッセージにはバリエーションがあります。

まずは、文字通り、nullで初期化しただけの変数(配列でもない)に対して配列の添え字でアクセスしようとするパターン。

$noarray = null;
if ($noarray[0]) {
    print "hoge";
}

これを実行して表示されるメッセージは、今回のきっかけとなった。

Warning: Trying to access array offset on value of type null 

です。

今度はnullではなく、数値「1」で初期化してみます。

$noarray = 1;
if ($noarray[0]) {
    print "hoge";
}

すると、メッセージは

Warning: Trying to access array offset on value of type int

と変わります。

ようするに「配列じゃないものに配列としてアクセスしようとしているぞ!」が警告で、最後のところはその型を示してくれるというわけです。

じゃあ、空の配列に対して同じことをしたらどうなるかというと。

$ar = array();
if ($ar[0]) {
    print "hoge";
}

この場合のメッセージは、以下のように全く違うものになります。

Warning: Undefined array key 0

これだけ見ても「Warning: Trying to access array offset・・・」のメッセージが出力されたら、そこは「バグ」だと言い切れると思うんですよね。

 

修正は配列としてアクセスする前にチェックすること

修正は「配列としてアクセスする前に配列かどうかチェックすること」につきます。

例えば、上記の「1」で初期化するケースだと

$noarray = 1;
if (is_array($noarray) == true && $noarray[0]) {
    print "hoge";
} else {
    print("not array!!");
}

みたいにしてやると、警告メッセージではなく「not array」が表示されます

このやり方なら「null」で初期化した場合も同じようにできます。

こんな感じですね。

$noarray = null;
if (is_array($noarray) == true && $noarray[0]) {
    print "hoge";
} else {
    print("not array!!");
}

メッセージが「Warning: Trying to access array offset on value of type null」の場合だと、「isset()」でチェックしたり、nullチェックでもいけますが、「 on value of type int」なんかの場合には抜けてしまうので、僕は配列チェックが良いと思ってます。

ではでは。