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

来源:互联网 发布:mysql.sock 编辑:程序博客网 时间:2024/05/15 02:30
深入理解面向对象析构函数回收机制

一、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
原创粉丝点击