析构函数: __destruct()和内存

析构函数

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值