PHP/Konstruktory i destruktory

Z Wikibooks, biblioteki wolnych podręczników.

< PHP

Poprzedni rozdział: Klasy i obiekty Spis treści Następny rozdział: Dziedziczenie

Spis treści

[edytuj] Konstruktory i destruktory

Metody klas nie muszą być wywoływane wyłącznie przez programistę tworzącego dany skrypt. Istnieje pewna grupa metod, które są wywoływane automatycznie przez interpreter w momencie zajścia jakiegoś zdarzenia - metody takie nazywamy magicznymi, a w PHP możemy poznać je po tym, że ich nazwy rozpoczynają się od dwóch podkreśleń: __.

Pierwszymi magicznymi metodami, jakie poznamy, będą konstruktor i destruktor, wywoływane odpowiednio w momencie tworzenia oraz niszczenia obiektu.

[edytuj] Konstruktor

Konstruktor jest metodą o nazwie __construct(), która może pobierać parametry, lecz nie wolno jej zwracać wartości. Jej zadaniem jest zainicjowanie nowoutworzonego obiektu. Wracając do przykładu z klasami reprezentującymi osoby, można je przepisać następująco:

<?php

        class osoba
        {
                public $imie;
                public $nazwisko;
                
                public function __construct($imie, $nazwisko)
                {
                        $this -> ustawPersonalia($imie, $nazwisko);
                } // end __construct();

                public function ustawPersonalia($imie, $nazwisko)
                {
                        $this -> imie = $imie;
                        $this -> nazwisko = $nazwisko;
                } // end ustawPersonalia();
                
                public function personalia()
                {
                        return $this -> imie.' '.$this -> nazwisko;               
                } // end personalia();  
        }
        
        $osoba = new osoba('Adam', 'Kowalski');
       
        echo $osoba -> personalia();
?>

Teraz personalia osoby możemy ustawić zarówno stosowną metodą, jak i w momencie tworzenia obiektu, ponieważ stworzyliśmy konstruktor, który pobiera imię i nazwisko i kieruje je do metody ustawPersonalia(). Zauważmy, że w takim wypadku przekazujemy te parametry tuż przy nazwie klasy tak, jakby to była funkcja. Jeśli konstruktor nie pobiera żadnych parametrów, możemy (acz nie musimy) pominąć nawiasy:

// wywołanie konstruktora, który nie pobiera parametrów
$obiekt = new klasa;
$obiekt = new klasa();
Uwaga! Uwaga!
W PHP4 metoda konstruktora musiała nazywać się identycznie, jak klasa, tj. jeśli mieliśmy klasę osoba, jej konstruktorem była metoda o nazwie osoba. Dla zachowania kompatybilności, PHP5 wciąż akceptuje takie konstruktory, lecz dopiero w drugiej kolejności, zaś zostanie to usunięte w PHP6.

Ćwiczenie: W poprzednim rozdziale podaliśmy zbudowany na OOP system konfiguracji. Jedną z klas wchodzących do zestawu była fileResource. Dodaj do niej konstruktor, który pobiera nazwę z plikiem konfiguracyjnym tak, aby można go było podać już w momencie tworzenia obiektu. Przerób kod korzystający z tego zestawu klas, aby korzystał z konstruktora.

[edytuj] Destruktor

Destruktor zaś nazywa się __destruct(). Nie może on ani pobierać parametrów, ani zwracać jakichkolwiek wartości. Wywoływany jest w momencie niszczenia obiektu (czyli sytuacji, gdy nie ma już żadnych odwołań do obiektu). Tłumacząc praktycznie:

<?php

        class MojaKlasa 
        {
                
                public $zmienna;

                public function __construct($zmienna) 
                {
                        $this -> zmienna = $zmienna;
                }

                public function __destruct() 
                {
                        echo $this -> zmienna;
                }

        }

        $klasa = new MojaKlasa('tekst');
        $klasa -> zmienna = 'innytekst';

?>

Powyższy przykład wyświetli napis innytekst. Jak widać, destruktor jest wywoływany jako ostatni. Ta właściwość przydaje się np. przy zamykaniu połączeń z bazą danych.

[edytuj] Zakończenie