Menu
CoddyTech

析构函数(__destruct)

本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 8 课,共 91 课。

__destruct 方法是一种特殊方法,在对象被销毁时会自动调用。当对象不再有任何引用,或脚本结束时,对象就会被销毁。

下面是一个同时包含构造函数和析构函数的类示例:

<?php
class Resource {
    public $name;

    public function __construct($name) {
        $this->name = $name;
        echo $this->name . " was created\n";
    }

    public function __destruct() {
        echo $this->name . " was destroyed\n";
    }
}

创建一个对象,并观察它的生命周期:

echo "=== Start ===\n";
$r = new Resource("Connection");
echo "Using " . $r->name . "\n";
unset($r);  // 显式销毁对象
echo "=== End ===\n";

输出:

=== Start ===
Connection was created
Using Connection
Connection was destroyed
=== End ===

unset() 函数会移除对对象的引用,并立即触发析构函数。

如果你不调用 unset(),脚本结束时会自动运行析构函数:

$r = new Resource("Logger");
echo "Working...\n";
// 脚本结束时会自动调用 __destruct

输出:

Logger was created
Working...
Logger was destroyed

要点:当对象不再需要时,__destruct 方法可用于执行清理任务,例如关闭文件、释放资源或记录日志。

challenge icon

挑战

中等

完成 resource.php 中的 Resource 类:

  1. 添加一个 __construct 方法,接收 $name,将它设为属性,并打印 "[name] was created"
  2. 添加一个 logMessage 方法,接收 $message 并打印 "Log: [message]"
  3. 添加一个 __destruct 方法,打印 "[name] was destroyed"

driver.php 文件将测试你的 Resource 对象的生命周期。

亲手试试

<?php
require_once 'resource.php';

$testCase = trim(fgets(STDIN));

if ($testCase == "basic_test") {
    echo "=== Start ===\n";
    $r = new Resource("FileHandler");
    echo "Using " . $r->name . "\n";
    unset($r);
    echo "=== End ===\n";
} elseif ($testCase == "auto_destruct_test") {
    $r = new Resource("Logger");
    $r->logMessage("Application started");
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: PHP 在线编译器