3

我有一个存储在 PHP 数组中的客户端类对象数组。有时我需要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 回答