首頁  >  文章  >  後端開發  >  php中析構函數__destruct與垃圾回收機制解析

php中析構函數__destruct與垃圾回收機制解析

黄舟
黄舟原創
2017-07-02 10:24:272335瀏覽

析構函數
當某個物件成為垃圾或當物件被明確銷毀時執行。
PHP5中提供的析構函式是destruct,其與建構方法construct相對應。

垃圾回收-GC(Garbage Collector)
在PHP中,沒有任何變數指向這個物件時,這個物件就變成垃圾,PHP會將其在記憶體中銷毀。
這是PHP的GC(Garbage Collector)垃圾處理機制,垃圾加收可以防止記憶體溢位。
當一個PHP執行緒結束時,目前佔用的所有記憶體空間都會被銷毀,目前程式中的所有物件同樣被銷毀。

destruct() 析構函數,是在垃圾物件被回收時執行。
析構函數是由系統自動調用的,也可以被明確調用,但不要這樣做。

如下面程式所示,程式結束前,所有物件都被銷毀。析構函數被呼叫了。

<?php
class Person {
	public function destruct(){
		echo &#39;析构函数现在执行了 <br />&#39;;
		echo &#39;这里一般用来设置、关闭数据库、关闭文件等收尾工作&#39;;
	}}$p = new Person();for($i = 0; $i < 5; $i++){
	echo "$i <br />";}
	?>

程式運行結果:

0 1 2 3 4 析构函数现在执行了 
这里一般用来设置、关闭数据库、关闭文件等收尾工作

當物件沒有指向時,物件被銷毀。

<?php
class Person {
	public function destruct(){
		echo &#39;析构函数现在执行了 <br />&#39;;
	}
}

$p = new Person();
$p = null; // 析构函数在这里执行了
$p = "abc"; // 一样的效果
for($i = 0; $i < 5; $i++){
	echo "$i <br />";
}
?>

程式運行結果:

析构函数现在执行了 
0 
1 
2 
3 
4
上面的範例中,我們將$p設為空或賦予$p一個字串,這樣$p之前指向的對象就變成垃圾對象了。 PHP將這個物件垃圾銷毀。

php unset變數
<?php
class Person {
	public function destruct(){
		echo &#39;析构函数现在执行了 <br />&#39;;
	}
}

$p = new Person();
$p1 = $p;

unset($p);
echo &#39;现在把 $p 被销毁了,对象是否也被销毁了呢? <br />&#39;;

for($i = 0; $i < 5; $i++){
	echo "$i <br />";
}

echo &#39;现在再把 $p1 也销毁掉,即已经没有指向对象的变量了<br />&#39;;
unset($p1); // 现在没有指向对象的变量了,析构函数在这里执行了
?>

程式運行結果:

现在把 $p 被销毁了,对象是否也被销毁了呢?
0 
1 
2 
3 
4 
现在再把 $p1 也销毁掉,即已经没有指向对象的变量了
析构函数现在执行了

unset 銷毀的是指向物件的變量,而不是這個物件。


以上是php中析構函數__destruct與垃圾回收機制解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn