上一节我们学习了PHP的OOP构造函数,本节我们将学习PHP的OOP析构函数。

析构函数的作用是在对象被销毁时自动执行清理代码,主要用于释放对象占用的外部资源(如文件句柄、数据库连接等)。

以下四种情况会触发PHP自动调用析构函数:

1. 脚本执行结束时:

当PHP脚本执行完毕,所有剩余的对象都会被销毁,它们的析构函数被自动调用。

2. 对象超出作用域时:

当对象在函数内部创建,函数结束时对象离开作用域,析构函数被自动调用。

3. 使用unset()函数时:

对对象变量使用unset()会立即销毁该引用,可能触发析构函数。

4. 变量被重新赋值时:

对象变量被赋予新值,原对象引用减少,可能触发析构函数。

重要:析构函数名为__destruct(),开发者不能手动调用它! PHP引擎会在上述时机自动调用。你只需要在析构函数内部编写清理资源的代码。

例如,当Dotcpp对象持有文件句柄时,可以在析构函数中关闭这些资源:

<?php 
// 1. 定义一个类
class Dotcpp {
    // 2. 声明一个私有属性:文件句柄
    private $fileHandle;
    
    // 3. 构造函数:创建对象时执行
    public function __construct() {
        // 4. 打开一个文件,获取文件句柄(这是外部资源)
        $this->fileHandle = fopen('data.txt', 'w');//文件存在就清空重写,文件不存在就自动创建一个data.txt文件
        // 现在对象持有一个文件资源,操作系统层面保持文件打开状态
    }
    
    // 5. 析构函数:对象销毁时自动执行
    public function __destruct() {
        // 6. 关闭文件句柄,释放操作系统资源
        fclose($this->fileHandle);
        // 7. 输出提示信息
        echo "资源已清理";
    }
}
// 8. 创建对象(触发构造函数)
$obj = new Dotcpp();
// 此时:data.txt 文件被打开并保持打开状态
// 9. 这里可以写一些使用文件的代码...
// fwrite($obj->fileHandle, "一些数据");
// 10. 脚本执行到这里结束...
// PHP会自动:1. 销毁 $obj 对象 2. 自动调用 $obj->__destruct()
// 结果:文件被自动关闭,输出"资源已清理"
?>

访问test.php后我们可以看到:

test.php

此案例中,$fileHandle作为私有属性,虽然不能从外部直接访问和关闭,但析构函数确保了即使在开发者忘记手动关闭的情况下,文件资源也能被自动释放,避免了资源泄漏的风险。

总结:PHP 类中析构函数的主要功能是清除和善后,确保对象持有的外部资源(如文件句柄、数据库连接、网络连接等)得到正确释放,防止资源泄漏。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)