PHP面向对象编程:析构方法的语法和简单举例

发布于 2022-11-26  1923 次阅读


与构造方法相对的即析构方法,构造方法是对象在实例化时自动调用的方法,相反的,析构方法是对象被销毁时自动执行的魔术方法。

在PHP中,析构方法并不常用,因为PHP脚本执行速度较快且PHP自身的内存释放机制(PHP会在脚本执行完毕之后回收内存)也已经满足了基本的内存回收要求。但是在实际应用的需求中或许会遇到需要使用析构方法的场景。

PHP析构方法的格式是:

public function __destruct(){
 code...; 
}

自动调用析构方法的场景(对象被销毁的场景):

  1. 对象的值被改变时
  2. 对象被unset()销毁时
  3. 脚本进程结束时

满足执行析构方法的基本场景只有以上三种。

1.对象的值改变:

class MyTest{
    function __construct(){
        echo __FUNCTION__;    
    }
    function __destruct(){
        echo "<br>析构方法";
    }
}


$obj=new MyTest();

$obj=1;
/*__construct
析构方法
*/

2.对象被unset()销毁时:

class MyTest{
    function __construct(){
        echo __FUNCTION__;    
    }
    function __destruct(){
        echo "<br>析构方法";
    }
}


$obj=new MyTest();

unset($obj);
@var_dump($obj);
/*__construct
析构方法NULL
*/

3.脚本执行完毕时

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 "清空缓冲区";
//脚本执行完毕,释放内存
//最后结果:清空缓冲区脚本执行完毕,释放内存

析构方法实质上仍然是一个类方法,可以被对象调用,但毫无意义。