与构造方法相对的即析构方法,构造方法是对象在实例化时自动调用的方法,相反的,析构方法是对象被销毁时自动执行的魔术方法。
在PHP中,析构方法并不常用,因为PHP脚本执行速度较快且PHP自身的内存释放机制(PHP会在脚本执行完毕之后回收内存)也已经满足了基本的内存回收要求。但是在实际应用的需求中或许会遇到需要使用析构方法的场景。
PHP析构方法的格式是:
public function __destruct(){
code...;
}
自动调用析构方法的场景(对象被销毁的场景):
- 对象的值被改变时
- 对象被unset()销毁时
- 脚本进程结束时
满足执行析构方法的基本场景只有以上三种。
- 对象的值改变:
class MyTest{
function __construct(){
echo __FUNCTION__;
}
function __destruct(){
echo "<br>析构方法";
}
}
$obj=new MyTest();
$obj=1;
/*__construct
析构方法
*/
- 对象被unset()销毁时:
class MyTest{
function __construct(){
echo __FUNCTION__;
}
function __destruct(){
echo "<br>析构方法";
}
}
$obj=new MyTest();
unset($obj);
@var_dump($obj);
/*__construct
析构方法NULL
*/
- 脚本执行完毕时
class MyTest{
function __construct(){
echo __FUNCTION__;
}
function __destruct(){
echo "<br>析构方法";
}
}
$obj=new MyTest();
/*__construct
析构方法
*/
注意看第三种情况,为什么对象没有被改变,脚本是正常执行的析构方法仍然被执行了呢?这就是因为PHP的垃圾回收机制,在脚本执行完毕后,PHP会自动销毁对象来节省内存,而当脚本执行完毕,对象被回收,相当于对象被unset()销毁,就触发了析构函数。
看一个例子:
class my{
function destruct(){
echo "脚本执行完毕,释放内存";
}
}
$obj=new my();
//对象被创建
echo '输出内容';
ob_clean();
echo "清空缓冲区";
//脚本执行完毕,释放内存
//最后结果:清空缓冲区脚本执行完毕,释放内存
析构方法实质上仍然是一个类方法,可以被对象调用,但毫无意义。
Comments NOTHING