旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

[PHP] 存在しない配列のキーにアクセスしたときの挙動まとめ

2008年3月31日

PHP5で、配列ではない型の変数や、
配列でも存在しない識別子に対して $array[“key”] の
アクセスを行ったときの挙動のまとめです

正確に挙動を抑えておけば、イチイチ (array) とかをやらないでいいので、
ひとりで開発してる分には楽になりますよね、ということで。

<?php
ini_set("display_errors", 1);
error_reporting(E_ALL);
$a = null;
$b = $a["foo"];
var_dump($b); // -> null
$a = 1;
$b = $a["foo"];
var_dump($b); // -> null
$a = 1.11;
$b = $a["foo"];
var_dump($b); // -> null
$a = "str";
$b = $a["foo"]; // -> "s"
var_dump($b);
$a = "str";
$b = $a["2foo"]; // -> "r"
var_dump($b);
$a = true;
$b = $a["foo"];
var_dump($b); // -> null
$a = false;
$b = $a["foo"];
var_dump($b); // -> null
$a = array();
$b = $a["foo"]; // -> Notice Error
var_dump($b); // -> null
$a = new SimpleClass;
$b = $a["foo"]; // -> Fatal Error
class SimpleClass {
public $foo = 1;
}

まとめてみて、ちょっと気に掛かったのは

  • string型の場合は、識別子をinteger型にキャストした上での各文字へのアクセスとなること
  • 非array型に対して $array[“key”] とやっても何もエラーが出ないくせに、array型で存在しない識別子にアクセスするとNotice Errorを吐くこと
  • クラスインスタンスに対してのみ、Fatal Error を吐くこと

この辺でしょうか、まぁ許容範囲です。

これで自分ルール的には

$row = $db->get_row($conditions); // null か データセットのarrayを返す
if ($row["column_name"] === null) { /* ... */ }

こういう書き方をしてもいいってことで、FA!

でも、PHPをあんまり書かない人なら
他言語に合わせて丁寧にキャストした方が
結局のところ全体の労力は少なくなると思うので
やらない・知らない方がいいっぽい気がします。