Menu
Coddy logo textTech

Destruktor (__destruct)

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 8 z 91.

Metoda __destruct to specjalna metoda, która jest wywoływana automatycznie, gdy obiekt zostaje zniszczony. Obiekt zostaje zniszczony, gdy nie ma już do niego żadnych odwołań lub gdy skrypt się kończy.

Oto przykład klasy zawierającej zarówno konstruktor, jak i destruktor:

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

Utwórz obiekt i obserwuj jego cykl życia:

echo "=== Start ===\n";
$r = new Resource("Connection");
echo "Using " . $r->name . "\n";
unset($r);  // jawnie zniszcz obiekt
echo "=== End ===\n";

Wynik:

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

Funkcja unset() usuwa odwołanie do obiektu, natychmiast wywołując destruktor.

Jeśli nie wywołasz unset(), destruktor uruchomi się automatycznie po zakończeniu skryptu:

$r = new Resource("Logger");
echo "Working...\n";
// __destruct jest wywoływana automatycznie na końcu skryptu

Wynik:

Logger was created
Working...
Logger was destroyed

Najważniejsze: metoda __destruct jest przydatna do zadań porządkowych, takich jak zamykanie plików, zwalnianie zasobów czy rejestrowanie informacji, gdy obiekt nie jest już potrzebny.

challenge icon

Wyzwanie

Średni

Uzupełnij klasę Resource w pliku resource.php:

  1. Dodaj metodę __construct, która przyjmuje $name, ustawia go jako właściwość i wyświetla "[name] was created"
  2. Dodaj metodę logMessage, która przyjmuje $message i wyświetla "Log: [message]"
  3. Dodaj metodę __destruct, która wyświetla "[name] was destroyed"

Plik driver.php przetestuje cykl życia obiektów klasy Resource.

Spróbuj swoich sił

<?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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online