析構(gòu)函數(shù)(__destruct()):當(dāng)某個對象的所有引用都被刪除(成為垃圾)或者當(dāng)對象被顯示銷毀時執(zhí)行华望,析構(gòu)函數(shù)不能帶參數(shù)
在php中,沒有任何變量指向這個對象時美澳,這個對象就成為垃圾获洲,php會將其在內(nèi)存中銷毀。這是php的GC(Garbage Collector)垃圾處理機(jī)制淹禾,目的是防止內(nèi)存溢出
php中的變量在內(nèi)存中存在于一個zval的變量容器中馁菜,機(jī)構(gòu)如下:
變量類型
變量值
is_ref 是bool值,用來區(qū)分變量是否屬于引用集合铃岔,表示變量是否有一個以上的別名
refcount 引用計(jì)數(shù)器汪疮,表示指向這個zval變量容器的變量個數(shù)峭火,
當(dāng)refcount值為1時,is_ref的值為false智嚷。因?yàn)楫?dāng)refcount為1時卖丸,此變量不可能有多個別名,也就不存在引用了盏道。
當(dāng)refcount為0時稍浆,zval已成為垃圾可回收
class Person
{
public function __construct()
{
echo '有對象創(chuàng)建了','<br>';
}
public function __destruct()
{
echo '有對象銷毀了';
}
}
$p1 = new Person();
echo xdebug_debug_zval('p1');
//unset($p1); //手動銷毀
//$p1 = 12; //賦值可以是任何類型的值
echo '<hr>';
/*
有對象創(chuàng)建了
p1:
(refcount=1, is_ref=0)
object(Person)[1]
--------------------------------
有對象銷毀了
有對象創(chuàng)建了
p1:
(refcount=1, is_ref=0)
object(Person)[1]
有對象銷毀了
--------------------------------
*/
class Person
{
public function __construct()
{
echo '有對象創(chuàng)建了','<br>';
}
public function __destruct()
{
echo '有對象銷毀了';
}
}
$p1 = new Person();
echo xdebug_debug_zval('p1');
$p2 = $p1;
echo xdebug_debug_zval('p1');
unset($p1);
echo xdebug_debug_zval('p2');
$p2 = true;
echo '<hr>';
/*
*
有對象創(chuàng)建了
p1:
(refcount=1, is_ref=0)
object(Person)[1]
p1:
(refcount=2, is_ref=0)
object(Person)[1]
p2:
(refcount=1, is_ref=0)
object(Person)[1]
有對象銷毀了
---------------------------------------
*/
class Person
{
public function __construct()
{
echo '有對象創(chuàng)建了','<br>';
}
public function __destruct()
{
echo '有對象銷毀了';
}
}
/*$p1 = new Person();
$p2 = new Person();
$p3 = new Person();
$p1 = $p2 = $p3 = new Person();*/
/*
有對象創(chuàng)建了
有對象創(chuàng)建了
有對象銷毀了有對象創(chuàng)建了
有對象銷毀了有對象創(chuàng)建了
有對象銷毀了有對象銷毀了
*/
$p1[] = new Person();
$p1[] = &$p1;
echo xdebug_debug_zval('p1');
unset($p1);
echo '<hr>';
/*
有對象創(chuàng)建了
p1:
(refcount=2, is_ref=1) 如果是引用賦值,is_ref=1,否則為0
array (size=2)
0 => (refcount=1, is_ref=0)
object(Person)[1]
1 => (refcount=2, is_ref=1)
&array<
--------------------------------------------
有對象銷毀了
*/