析构函数
构造函数是在对象产生的时候,自动执行
析构函数是在对象销毁的时候,自动执行
构造函数就是出生时啼哭
析构函数就是临终遗言
对象如何销毁?
1、显式的销毁,unset、赋值为NULL都可以
2、PHP是脚本语言,在代码执行到最后一行的时候,所有申请的都要释放掉
对象占用的内存也要释放,对象就会被销毁了
因此:对于PHP所做的web程序,想犯内存泄露的错误也很难
class Human{
public $name=null;
public $gender=null;
public funciton __construct(){
echo "出生了<br/>";
}
public function __destruct(){
echo "终究没有逆袭<br/>";
}
}
$a = new Human();
$b = new Human();
$c = new Human();
$d = new Human();
unset($a);
$b = true; // 把对象赋值为其他,也会销毁对象
$c = NULL;
// 死3次
echo '<hr />';
运行结果:
最后一次销毁,是PHP的页面执行完毕了;最后一行也执行完毕了.
然后系统回收, $d此时才销毁,
因此 显示hr 即灰线后面
对象的回收机制
class Human {
public $name = '张三';
public $gender = null;
public function __destruct() {
echo '死了!<br />';
}
}
$a = new Human();
$b = $c = $d = $a;
echo $a->name,'<br />';
echo $b->name,'<br />';
$b->name = '李四';
echo $a->name,'<br />';
echo $b->name,'<br />';
unset($a); // $b,$c,$d在指向对象,因此对象不能销毁.
echo '<hr />';
问:
1、死几次?
2、死在hr下面还是hr上面?
答:
只有一个对象,只死1次;死在系统回收时,即页面执行完毕,因此在灰线下
再次举例
class Human {
public $name = '张三';
public $gender = null;
public function __destruct() {
echo '死了!<br />';
}
}
$e = $f = $g = new Human();
unset($e); //对象并没有销毁
echo 'unset e<br />';
unset($f); //对象并没有销毁
echo 'unset f<br />';
unset($g); //此处执行的析构函数
echo 'unset g<br />'; //析构函数执行之后才执行
运行结果;
简单总结:
构造函数 __construct()
在new对象时,自动执行
new 对象时,
1:申请内存,生成对象(属性集合)
2:如果有构造函数,则执行.
3:返回该对象地址
析构函数__destruct()
对象销毁时执行
什么叫对象销毁?
答:
a=newHuman();
a 并不是对象,他只是一个变量名,指到对象.
unset($a) 未必销毁了对象.
我们知道, 一个对象如果还有其他变量来引用,unset($a)并不会销毁.
当引用为0时,对象才销毁.