您当前的位置: 首页 > 学无止境 > 网站建设 网站首页网站建设
燕十八面向对象-析构函数回收机制深入解析
发布时间:2015-08-22 20:31:20编辑:雪饮阅读()
这次雪饮个人博客深深的领悟到了垃圾回收机制,真的很感谢燕老师。
既然对象在被销毁的时候执行析构函数,那么如下示例将会出现什么样的结果呢?
class Cs{
public function __destruct(){
echo "雪饮个人博客说:对不起,你挂了。。。。<br/>";
}
}
$a=new Cs();
$b=$d=$c=$a;
unset($a);
echo "<hr/>";
刚开始都会认为是4次,其实不然,由于对象默认是引用的,所以$b,$d,$c与$a都引用相同的一个对象,那么任何一个变量改变了该对象其它变量值都将会发生改变。也就是说一直以来只存在一个对象而不是4个对象,所以这一个对象被销毁了,并不会执行4次析构方法的。由于这个对象被几个变量同时引用着所以unset没有生效,不允许生效,但整个php脚本执行完那一刻所有的对象都必须被销毁掉。上面的结果显示在hr下划线之下也便证明了是在整个php结束时才执行析构函数的。
以下示例可以证明对象的引用:
class Cs{
public $name="雪饮个人博客";
public function __destruct(){
echo "雪饮个人博客说:对不起,你挂了。。。。<br/>";
}
}
$a=new Cs();
$b=$d=$c=$a;
echo $a->name;
echo "<br/>";
echo $b->name;
echo "<br/>";
$c->name="雪饮个人博客2";
echo $a->name;
echo "<br/>";
echo $b->name;
echo "<br/>";
虽然只是$c改了对象的属性,而$a,$b都跟着改变了name值。
对于另外一种情况:一个变量是被实例化出来的一个对象,而该变量立马又被赋值一个其它值,那么也会触发析构函数,因为php的回收机制会将没有被引用的闲置对象销毁掉。基于此原理,那么如果在一个变量unset的时候若是其它引用这个对象的变量也早都已经被unset了,那么这个最后的变量unset的时候自然会触发析构函数的。
下面的示例可以证明一个对象的所有引用都被unset之后才被销毁;
<?php
class Cs{
public function __destruct(){
echo "雪饮个人博客说:对不起,你挂了。。。。<br/>";
}
}
$a=new Cs();
$b=$d=$c=$a;
unset($a);
echo "<hr/>1";
unset($c);
echo "<hr/>2";
unset($d);
echo "<hr/>3";
unset($b);
echo "<hr/>4";
?>
析构方法的执行结果出现在了“4”之前"3"之后,因为最后一个变量被unset刚好处于“4”之前。
关键字词:燕十八,析构函数,个人博客