[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 メーリングリストの案内