2012-09-19 34 views
3

我有一个存储在PHP数组中的Client类对象的数组。有时我需要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. 

为什么会发生这种情况,我有什么替代方案?

回答

2

如果$array超出范围,那么其余的对象也将被销毁。

看起来就是这样。你会看到你的破坏跟踪消息,然后你的print_r()输出,然后其他的对象被破坏。

+0

因为脚本结束了,所以会调用destruct。得到它 – nick

+0

这也可以做到。 :)我不确定这是否是剧本的结尾。 – jimp

+0

是的,但这是一个守护进程..它永远不会结束:) – nick