It's raining cats and dogs.

無駄なことなんてないはず

phpで未定義の変数にアクセスしてみた

phpで未定義の変数に対してアクセスしてみると不思議な挙動をしますね。

未定義(or null)の変数に対してプロパティっぽいアクセスをしてみる

$ php -a
php > // $a = null; でも同様
php > $a->hoge = 'test';
php > var_dump($a);
object(stdClass)#1 (1) {
  ["hoge"]=>
  string(4) "test"
}

なにこれこわい。。。何も宣言してないのにstdClassのオブジェクトを作って、勝手にプロパティまで作ってくれた!
ちなみにerror_reportingでE_ALL、E_STRICTを設定するとnoticeがでます

$ php -a
php > error_reporting(E_ALL | E_STRICT);
php > $a->hoge = 'test';

Strict Standards: Creating default object from empty value in php shell code on line 1
php > var_dump($a);
object(stdClass)#1 (1) {
  ["hoge"]=>
  string(4) "test"
}
php > 

未定義(null)の連想配列に対して値を設定してみた

php > $a['hoge'] = 'test';
php > var_dump($a);
array(1) {
  ["hoge"]=>
  string(4) "test"
}
php > 

こっちも勝手に作ってくれる。
ただ、error_reportingを設定しても警告はでなかった。
同様に、配列も作れた。

php > $a[] = 'test';
php > var_dump($a);
array(1) {
  [0]=>
  string(4) "test"
}
php > 

想定通りですね。
こっちもerror_reportingで警告はでなかった。

まとめ

PHPすごい!
でもキモすぎる!