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

被折叠的 条评论
为什么被折叠?



