开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第一阶段:析构方法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/711/detail/12663
析构方法
内容介绍:
一、析构方法
一、析构方法
1、目标
了解析构方法的作用,能够实际应用析构方法解决释放资源的问题
2、概念
析构方法: __destruct(),也是一种类结构中魔术方法,与构造方法一样,也是系统规定好,只需要开发人员抄一遍即可,对象在被销毁时会自动调用(触发点不一样,构建对象是在被创建的时候自动调用,构造对象是为了初始化资源)
(1)析构方法是用来对象销毁时主动释放资源的
(2)对象销毁
对象无变量指向(变量指向其他数据)
对象被主动销毁(unset 销毁对象变量)
脚本执行结束(自动释放资源)
(3)PHP 脚本执行结束会释放所有资源,所以一般较少使用析构方法(在高级语言编程析构方法利用比较多,C++ 分配的内存占用的资源如果不能释放,可能资源就一直被占,虽然对象没了但是有可能资源还被占用,而且大型的语言一般情况对象不会很快的消失, PHP 用完马上就消失了,所以比较少用)
3、步骤
(1)定义类结构
(2)确定需要在对象销毁时释放资源
(3)使用析构方法释放资源
4、示例
(1)析构方法实现:类中增加一个 _destruct() 方法
class saler{
# 析构方法
public function _destruct(){
echo ___FUNCTION__;
}
}
(2)析构方法调用:析构方法是在对象被销毁时自动,对象的“垂死挣扎”
# 实例化对象
$s = new saler();
# 对象变量指向其他数据
$s = 1;
# 主动销毁对象变量
unset($s);
# 脚本执行结束自动释放
代码 06destruct.php:
<?Php
#析构方法
class Saler{
#析构方法
public function _destruct(){
echo __FUNCTION_;
}
}
#实例化
$s = new s Saler;
会被调用,因为对象创建脚本执行完后要销毁
结果:_destruct
说明方法被执行
主动销毁:
<?Php
#析构方法
class Saler{
#析构方法
public function _destruct(){
echo __FUNCTION_;
}
}
#实例化
$s = new s Saler;
#主动销毁
$s = 1;
echo 'end';
结果:_destructend
#主动销毁
# $s = 1;
unset($s);
echo 'end';
结果一样
析构方法里面正常要释放资源,一般不用,用户看到结果时已经执行完了,脚本运行结束会自动回收
(3)析构方法也是普通方法,可以由对象直接调用
# 接析构方法实现代码
$s=new saler();
$s->__destruct(); # 思考:此时对象是否被销毁?
没有意义
<?Php
#析构方法
class Saler{
#析构方法
public function _destruct(){
# 释放资源
echo _FUNCTION_;
}
}
# 实例化
$s = new Saler;
#主动销毁
# $s = 1;
# unset($s);
#
#主动调用析构方法
$s-> destruct();
echo 'end';
结果:_
_destructend__destruct
end 之前有一次主动调用,end 之后有一次被动调用
调用方法不会代表对象被销毁,调用对象方法对象依然还是对象,没有消失,只是掉用方法,调用肯定会执行,如果脚本执行之后还执行一次说明那才是释放类型
5、小结
(1)析构方法是一种对象销毁时自动调用的方法
(2)析构方法是用来对象销毁自身所占用的资源(PHP 中用的不多,如果有大型的确定对象运行完之后,后面还有很长时间对象不会销毁,而且对象占用的资源比较多,也要使用析构方法来做)
(3)PHP 中脚本执行结束,系统会自动回收所有资源,因此一般PHP 中很少使用析构方法