析构函数: __destruct()和内存

来源:互联网 发布:淘宝画师招聘 编辑:程序博客网 时间:2024/05/16 06:59

析构函数

构造函数是在对象产生的时候,自动执行
析构函数是在对象销毁的时候,自动执行

构造函数就是出生时啼哭
析构函数就是临终遗言

对象如何销毁?
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时,对象才销毁.

0 0
原创粉丝点击