深入理解面向对象析构函数回收机制

本文通过四个示例详细解析了PHP中面向对象的析构函数(__destruct)如何工作,包括对象销毁的时机、条件及作用域等核心概念。
深入理解面向对象析构函数回收机制

一、Demo1

以下代码在执行时候,会执行几次析构函数?
class People
{

    public function __destruct()
    {
    echo "死掉了";
    }
}

    $a = new People();   // 注意下 这个$a 并不是一个对象 而是一个变量指向了对象
    $b = new People();
    $c = new People();
    $d = new People();

答案:四次!
解释:php是一门脚本语言,在这个脚本执行完毕后,会自动销毁这个对象,也就是会销毁四次这个对象。


二、Demo2
请问执行几次销毁?并且是在水平线下还是在水平线上?
class People
{
    public function __destruct()
    {
    echo "结束了~~";
    }
}

    $d = $c= $b= $a = new People();

    unset($a);

    echo "<hr>";

// 一个对象如果有其他变量指向它  unset一个并不能在内存中销毁

答:执行一次销毁 并且在水平线下;
解释: $d = $c= $b= $a = new People();这个其实相当于一个房间有四把钥匙,又因为对象是引用传参,所以你把$a 给删除了 或者这样说 你把a钥匙扔掉了,房间并不会摧毁。当程序执行完毕后,才会销毁。所以是在水平线下。


三、Demo3

输出几次 “结束了”?并且是在哪里输出的?
class People
{
    public function __destruct()
    {
        echo "结束了";
    }

}

    $a = new People();
    unset($a);

    echo "<hr>";  
答:输出一次 “结束了”,并且是在水平线上
解释:对象销毁了 所以直接执行析构函数了

四、Demo4
执行几次结束了 并且是在水平线上 还是水平线下
class People
{
    public function __destruct()
    {
        echo "结束了~~";
    }
}

$d = $c= $b= $a = new People();

unset($a);
unset($b);
unset($c);
unset($d);
echo "<hr>";

答:执行了一次结束了 并且是在水平线上
解释:第一次第二次第三次unset 不会出现  ,当第四次unset时候会先触发析构函数,然后在输出hr水平线。

$this 指向调用方法  $a->say();  那么 $this 就是$a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值