3

PHP配列に格納されているClientクラスオブジェクトの配列があります。配列内のこれらのオブジェクトの1つが必要な場合がありunset()、ソケット接続を明示的に閉じることを心配する必要はありません。私のためにそれをしたい__destruct()です。

class A{

    private $id;

    public function __construct( $id ){
        $this->id = $id;
    }

    public function __destruct(){
        echo "Calling destruct on " . $this->id . ".\n";
    }

}

$array = array();

for($i=0;$i<5;$i++){
    $array[$i] = new A($i);
}

unset($array[3]);

print_r($array);

デストラクタは、破壊している要素に対して適切に起動されます。ただし、要素が破棄されていなくても、配列内の他のすべてのデストラクタが呼び出されます。なんで?

Calling destruct on 3.
Array
(
    [0] => A Object
        (
            [id:A:private] => 0
        )

    [1] => A Object
        (
            [id:A:private] => 1
        )

    [2] => A Object
        (
            [id:A:private] => 2
        )

    [4] => A Object
        (
            [id:A:private] => 4
        )

)
Calling destruct on 0.
Calling destruct on 1.
Calling destruct on 2.
Calling destruct on 4.

なぜこれが起こっているのですか、そして私にはどのような選択肢がありますか?

4

1 に答える 1

2

$arrayスコープ外になると、残りのオブジェクトも破棄されます。

それが起こっているようです。破棄トレースメッセージが表示され、次にprint_r()出力が表示され、次に残りのオブジェクトが破棄されます。

于 2012-09-19T01:11:58.937 に答える