上一节我们学习了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后我们可以看到:

此案例中,$fileHandle作为私有属性,虽然不能从外部直接访问和关闭,但析构函数确保了即使在开发者忘记手动关闭的情况下,文件资源也能被自动释放,避免了资源泄漏的风险。
总结:PHP 类中析构函数的主要功能是清除和善后,确保对象持有的外部资源(如文件句柄、数据库连接、网络连接等)得到正确释放,防止资源泄漏。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程