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";