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 已销毁

注意事项
  1. 析构函数不能接收参数
  2. 不能手动调用析构函数
  3. 父类的析构函数不会自动调用,如需调用需使用 parent::__destruct()
  4. 在析构函数中抛出异常会导致致命错误
继承中的析构函数

子类可以继承父类的析构方法:

class ParentClass {
    public function __destruct() {
        echo "父类析构\n";
    }
}

class ChildClass extends ParentClass {
    public function __destruct() {
        parent::__destruct();
        echo "子类析构\n";
    }
}

$child = new ChildClass();
// 输出:父类析构 子类析构

通过合理使用析构函数,可以确保对象使用的资源被正确释放,避免内存泄漏和资源浪费。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐