[PHP] 存在しない配列のキーにアクセスしたときの挙動まとめ
2008年3月31日
PHP5で、配列ではない型の変数や、
配列でも存在しない識別子に対して $array[“key”] の
アクセスを行ったときの挙動のまとめです
配列でも存在しない識別子に対して $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をあんまり書かない人なら
他言語に合わせて丁寧にキャストした方が
結局のところ全体の労力は少なくなると思うので
やらない・知らない方がいいっぽい気がします。