析构函数(__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 方法可用于执行清理任务,例如关闭文件、释放资源或记录日志。
挑战
中等完成 resource.php 中的 Resource 类:
- 添加一个
__construct方法,接收$name,将它设为属性,并打印"[name] was created" - 添加一个
logMessage方法,接收$message并打印"Log: [message]" - 添加一个
__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");
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: PHP 在线编译器