foreach内では内部配列ポインタを触るな
先日のエントリ、PHP 5.1.6のforeachではポインタの進み方が違う?に関してkomuraさんより以下のようなコメントを頂き、
少し前に同じことを調べていました。
基本的な関数でこのように挙動が変化するのはどうか
と思いますね。
恐らく、意図した変更ではないように思います。
修正方法を少し考えていたのですが、結構面倒なので
諦めてしまいました。
原因は、以下の修正のようです。
Fixed bug #37715 (array pointers resetting on copy). (Dmitry)
http://bugs.php.net/bug.php?id=37715
ソースコードでは、以下の変更が行われています。
以下の変更を戻すと、PHP 5.2.3 以前と同じ挙動になります。
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_hash.c?r1=1.150&r2=1.151
あらためてbugs.php.netを探したところ、PHP Bugs: #42690 key function in foreach array does not start from the beginning of arrayというバグレポートが見つかりました。報告されている状況は、まさにforeach中での内部配列ポインタの件なんですが、これに付けられたコメントによると「foreach中でのkey()/next()/prev()といった関数は未サポートなので、これはバグではありません」という結論のようです。
確かに、foreach中で内部配列ポインタを意識するコードなんて普通書かないし、今回も他の人がハマっているのを見て気付いたのですが、マニュアルに言及あったかなあ…。
