析構函數(shù)和垃圾回收機制

析構函數(shù)(__destruct()):當某個對象的所有引用都被刪除(成為垃圾)或者當對象被顯示銷毀時執(zhí)行,析構函數(shù)不能帶參數(shù)

在php中,沒有任何變量指向這個對象時,這個對象就成為垃圾,php會將其在內存中銷毀。這是php的GC(Garbage Collector)垃圾處理機制,目的是防止內存溢出

php中的變量在內存中存在于一個zval的變量容器中,機構如下:
變量類型
變量值
is_ref 是bool值,用來區(qū)分變量是否屬于引用集合,表示變量是否有一個以上的別名
refcount 引用計數(shù)器,表示指向這個zval變量容器的變量個數(shù),
當refcount值為1時,is_ref的值為false。因為當refcount為1時,此變量不可能有多個別名,也就不存在引用了。
當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<
--------------------------------------------
有對象銷毀了
*/
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容