PHP 5.3.10 における参照時の謎挙動
久々におかしな仕様?バグ?にであったのでメモしておく。
問1: 下記のコードについて実行結果を予測し解答せよ
?php function drct($input) {} $hoge = array(); drct($hoge['aaa']); echo var_export($hoge, true)."\n";
問2: 下記のコードについて実行結果を予測し解答せよ
<?php function ref(&$input) {} $hoge = array(); ref($hoge['aaa']); echo var_export($hoge, true)."\n";
手元のPHP 5.3.10にて確認したところ下記のような結果が得られた
答1:
[hoge@localhost ~]$ php ./test.php PHP Notice: Undefined index: aaa in /home/hoge/test.php on line 4 PHP Stack trace: PHP 1. {main}() /home/hoge/test.php:0 Notice: Undefined index: aaa in /home/hoge/test.php on line 4 Call Stack: 0.0005 632544 1. {main}() /home/hoge/test.php:0 array ( )
答2:
array ( 'aaa' => NULL, )
答1 の結果は想定どおりの動きだが、答2の動きは予期しない動きではないだろうか?
おそらく、参照された瞬間に空の変数が生成されているっぽい
参照で渡した場合にNoticeがおきないことを利用してコードを書いている場合、気をつけないとこの副作用でバグを生む可能性があるので要注意
一応下記のように回避することも出来るが、これも$hoge['aaa'] がすでにセットされている場合に副作用があるので注意
<?php function ref(&$input) { } $hoge = array(); ref($hoge['aaa']); unset($hoge['aaa']); echo var_export($hoge, true)."\n";