2012-09-19 38 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