[PHP-users 15274]foreach()が正常動作しない
ISIGE, Akira
xia @ silvia.com
2003年 5月 14日 (水) 17:05:01 JST
いしげ です.
以下のコードで,foreach() が妙な挙動を示します.
---------------------
<?php
// add で項目を追加できる,リストのクラスを定義します
class testClass{
var $list;
function &add(){
$newitem = new stdClass;
$this->list[] =& $newitem;
return $newitem;
}
}
// ループしながらリストにオブジェクトを追加していきます
$test_class = new testClass();
foreach( array( 1, 2, 3 ) as $i ){
$item =& $test_class->add();
$item->hoge = $i;
// unset( $item ); // ←※
}
// リストを foreach() で回して出力します
foreach( $test_class->list as $item ){
print $item->hoge. " ";
}
?>
---------------------
※の部分の unset をしない状態で実行すると,
結果として
---------------------
1 2 2
---------------------
と出力されます.
調査してみると,最後の foreach() で,
3回目のループの際に $item が list[2] 初期化されず,
2回目のループの時の list[1] の情報が出力されているようです.
foreach で $test_class->list を直接触らず,
例えば array_keys( $test_class->list ) 等とすれば正常に動作します.
※部分で $item を unset しておけば,
3回目のループできちんと 3つめのオブジェクトの情報が出力されます.
$item が list[2] への参照になっていてはいけないようなのですが,
これは仕様として正常な動作なのでしょうか?
なお,以下のそれぞれの環境で同様の挙動を確認しました.
Miracle Linux 2.1 / PHP4.3.1
FreeBSD 4.7-RELEASE / PHP 4.3.1
Solaris 2.6 / PHP 4.1.2
------------
ISIGE, Akira
PHP-users メーリングリストの案内