PHP OOP - 析构函数
·
PHP OOP 析构函数详解
析构函数(Destructor)是面向对象编程中的一个重要概念,用于在对象销毁时自动执行清理操作。PHP 中的析构函数通过 __destruct() 方法实现,通常用于释放资源(如数据库连接、文件句柄等)。
析构函数的基本语法
析构函数的定义格式如下:
public function __destruct() {
// 清理逻辑
}
析构函数在以下情况下被调用:
- 脚本执行结束时
- 对象被显式销毁(如
unset()) - 对象引用计数为 0 时
基础示例
以下是一个简单的析构函数示例:
class MyClass {
public function __construct() {
echo "对象已创建\n";
}
public function __destruct() {
echo "对象已销毁\n";
}
}
$obj = new MyClass(); // 输出:对象已创建
unset($obj); // 输出:对象已销毁
资源清理示例
析构函数常用于释放资源,例如关闭文件:
class FileHandler {
private $fileHandle;
public function __construct($filename) {
$this->fileHandle = fopen($filename, 'r');
echo "文件已打开\n";
}
public function readLine() {
return fgets($this->fileHandle);
}
public function __destruct() {
fclose($this->fileHandle);
echo "文件已关闭\n";
}
}
$file = new FileHandler('example.txt');
echo $file->readLine();
// 脚本结束时自动调用 __destruct()
数据库连接示例
析构函数也可以用于关闭数据库连接:
class Database {
private $connection;
public function __construct() {
$this->connection = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
echo "数据库已连接\n";
}
public function query($sql) {
return $this->connection->query($sql);
}
public function __destruct() {
$this->connection = null;
echo "数据库已断开\n";
}
}
$db = new Database();
$result = $db->query("SELECT * FROM users");
// 脚本结束时自动断开连接
对象销毁顺序
多个对象的析构顺序与创建顺序相反:
class Logger {
private $name;
public function __construct($name) {
$this->name = $name;
echo "{$this->name} 已创建\n";
}
public function __destruct() {
echo "{$this->name} 已销毁\n";
}
}
$obj1 = new Logger('对象1');
$obj2 = new Logger('对象2');
$obj3 = new Logger('对象3');
// 输出顺序:对象3 已销毁,对象2 已销毁,对象1 已销毁
注意事项
- 析构函数不能接收参数
- 不能手动调用析构函数
- 父类的析构函数不会自动调用,如需调用需使用
parent::__destruct() - 在析构函数中抛出异常会导致致命错误
继承中的析构函数
子类可以继承父类的析构方法:
class ParentClass {
public function __destruct() {
echo "父类析构\n";
}
}
class ChildClass extends ParentClass {
public function __destruct() {
parent::__destruct();
echo "子类析构\n";
}
}
$child = new ChildClass();
// 输出:父类析构 子类析构
通过合理使用析构函数,可以确保对象使用的资源被正确释放,避免内存泄漏和资源浪费。
更多推荐
所有评论(0)