Menu
CoddyTech

Hàm hủy (__destruct)

Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 8 trên 91.

Phương thức __destruct là một phương thức đặc biệt, được gọi tự động khi một đối tượng bị hủy. Đối tượng bị hủy khi không còn tham chiếu nào đến nó hoặc khi tập lệnh kết thúc.

Đây là ví dụ về một lớp có cả hàm khởi tạo và hàm hủy:

<?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";
    }
}

Tạo một đối tượng và theo dõi vòng đời của nó:

echo "=== Start ===\n";
$r = new Resource("Connection");
echo "Using " . $r->name . "\n";
unset($r);  // hủy đối tượng (object) một cách tường minh
echo "=== End ===\n";

Đầu ra:

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

Hàm unset() xóa tham chiếu đến đối tượng, khiến hàm hủy chạy ngay lập tức.

Nếu bạn không gọi unset(), hàm hủy sẽ tự động chạy khi tập lệnh kết thúc:

$r = new Resource("Logger");
echo "Working...\n";
// __destruct tự động được gọi khi tập lệnh kết thúc

Đầu ra:

Logger was created
Working...
Logger was destroyed

Điểm chính: Phương thức __destruct hữu ích cho các công việc dọn dẹp như đóng tệp, giải phóng tài nguyên hoặc ghi nhật ký khi không còn cần đến một đối tượng.

challenge icon

Thử thách

Trung bình

Hoàn thiện lớp Resource trong resource.php:

  1. Thêm phương thức __construct nhận $name, đặt giá trị này làm thuộc tính và in ra "[name] was created"
  2. Thêm phương thức logMessage nhận $message và in ra "Log: [message]"
  3. Thêm phương thức __destruct in ra "[name] was destroyed"

Tệp driver.php sẽ kiểm tra vòng đời của các đối tượng Resource.

Tự làm thử

<?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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch PHP online