析構函數
當某個物件成為垃圾或當物件被明確銷毀時執行。
PHP5中提供的析構函式是destruct,其與建構方法construct相對應。
垃圾回收-GC(Garbage Collector)
在PHP中,沒有任何變數指向這個物件時,這個物件就變成垃圾,PHP會將其在記憶體中銷毀。
這是PHP的GC(Garbage Collector)垃圾處理機制,垃圾加收可以防止記憶體溢位。
當一個PHP執行緒結束時,目前佔用的所有記憶體空間都會被銷毀,目前程式中的所有物件同樣被銷毀。
destruct() 析構函數,是在垃圾物件被回收時執行。
析構函數是由系統自動調用的,也可以被明確調用,但不要這樣做。
如下面程式所示,程式結束前,所有物件都被銷毀。析構函數被呼叫了。
<?php class Person { public function destruct(){ echo '析构函数现在执行了 <br />'; echo '这里一般用来设置、关闭数据库、关闭文件等收尾工作'; }}$p = new Person();for($i = 0; $i < 5; $i++){ echo "$i <br />";} ?>
程式運行結果:
0 1 2 3 4 析构函数现在执行了 这里一般用来设置、关闭数据库、关闭文件等收尾工作
當物件沒有指向時,物件被銷毀。
<?php class Person { public function destruct(){ echo '析构函数现在执行了 <br />'; } } $p = new Person(); $p = null; // 析构函数在这里执行了 $p = "abc"; // 一样的效果 for($i = 0; $i < 5; $i++){ echo "$i <br />"; } ?>
程式運行結果:析构函数现在执行了
0
1
2
3
4
php unset變數<?php
class Person {
public function destruct(){
echo '析构函数现在执行了 <br />';
}
}
$p = new Person();
$p1 = $p;
unset($p);
echo '现在把 $p 被销毁了,对象是否也被销毁了呢? <br />';
for($i = 0; $i < 5; $i++){
echo "$i <br />";
}
echo '现在再把 $p1 也销毁掉,即已经没有指向对象的变量了<br />';
unset($p1); // 现在没有指向对象的变量了,析构函数在这里执行了
?>
程式運行結果:
现在把 $p 被销毁了,对象是否也被销毁了呢? 0 1 2 3 4 现在再把 $p1 也销毁掉,即已经没有指向对象的变量了 析构函数现在执行了
unset 銷毀的是指向物件的變量,而不是這個物件。
以上是php中析構函數__destruct與垃圾回收機制解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!