Konstruktor w PHP to metoda o nazwie __construct(). PHP wywołuje ją automatycznie, gdy piszesz new ClassName(...), a argumenty w nawiasach stają się jej parametrami, więc obiekt od początku ma ustawione wartości.
Bez konstruktora tworzyłbyś pusty obiekt i ustawiał każdą właściwość później, a nic nie powstrzymałoby cię przed zapomnieniem którejś. Z konstruktorem new User() bez argumentów kończy się ArgumentCountError.
Promocja właściwości w konstruktorze
Zadeklarowanie właściwości, wymienienie jej jako parametru i przypisanie $this->name = $name powtarza każdą nazwę trzy razy. Od PHP 8.0 słowo kluczowe widoczności przed parametrem konstruktora robi wszystkie trzy rzeczy naraz:
Promowany parametr może być też readonly (public readonly string $id), co jest najkrótszym sposobem zapisania niezmiennego obiektu wartości. Możesz mieszać parametry promowane ze zwykłymi, a treść konstruktora nadal może zawierać kod, który wykona się po przypisaniu promowanych właściwości.
Wartości domyślne i argumenty nazwane
Parametry konstruktora przyjmują wartości domyślne jak w każdej funkcji. Parametry z wartościami domyślnymi idą po wymaganych. Z argumentami nazwanymi (PHP 8.0) wywołujący może przejść od razu do potrzebnej opcji, zamiast powtarzać każdą wcześniejszą wartość domyślną:
Uruchom: wynik zawiera HTML, więc zakładka Page pokazuje trzy wyrenderowane przyciski, a zakładka Output znaczniki wypisane przez PHP. Zwróć uwagę na nawiasy w (new Button('Save'))->render(): od PHP 8.4 są opcjonalne, ale PHP 8.3 ich wymaga.
Walidacja argumentów w konstruktorze
Konstruktor nie może zwrócić false ani kodu błędu: to, co zwraca, jest ignorowane. Aby odrzucić złe dane, rzuć wyjątek. Obiekt wtedy w ogóle nie powstaje, więc reszta programu może ufać każdemu otrzymanemu obiektowi Temperature.
Przechwytywanie takich wyjątków dokładniej opisuje strona try catch.
Kilka konstruktorów przez statyczne metody fabryczne
PHP nie ma przeciążania konstruktorów: jedna klasa, jeden __construct. Gdy obiekt można zbudować z różnych danych (stringa z datą, tablicy, znacznika czasu), dodaj nazwane metody statyczne, które przygotowują argumenty i wywołują new static(...). Prywatny konstruktor zmusza wszystkich do korzystania z fabryk.
new Color(1, 2, 3) spoza klasy rzuca teraz Error („Call to private Color::__construct() from global scope”). Strona o static wyjaśnia, dlaczego użyto tu new static, a nie new self.
Wywołanie konstruktora rodzica przez parent::__construct
Gdy klasa potomna definiuje własny konstruktor, konstruktor rodzica sam się nie wykona. Wywołaj go przez parent::__construct(...), zwykle na początku, żeby właściwości rodzica były ustawione, zanim potomek doda własne:
Jeśli potomek w ogóle nie ma konstruktora, PHP używa konstruktora rodzica, a new Truck('Volvo') przekazałoby argumenty prosto do Vehicle::__construct. Więcej na ten temat w dziedziczeniu.
Zapomniane parent::__construct
Ten błąd nie daje komunikatu w linii, w której powstaje. Konstruktor potomka się wykonuje, typowane właściwości rodzica pozostają niezainicjowane, a program pada później, tam, gdzie nastąpi pierwszy odczyt:
Dodaj parent::__construct(); jako pierwszą linię Post::__construct i uruchom ponownie: wypisze datę. Pokrewna metoda, __destruct(), wykonuje się, gdy znika ostatnie odwołanie do obiektu albo kończy się skrypt. W codziennym kodzie rzadko jest potrzebna, bo PHP samo zamyka pliki i zwalnia pamięć na koniec każdego żądania.
Najczęściej zadawane pytania
Czym jest __construct w PHP?
__construct() to konstruktor: metoda, którą PHP wywołuje automatycznie zaraz po tym, jak new utworzy obiekt. Argumenty przekazane do new User('Ada', 36) trafiają do __construct(string $name, int $age), który zwykle zapisuje je we właściwościach.
Czym jest promocja właściwości w konstruktorze w PHP?
Od PHP 8.0 słowo kluczowe widoczności przy parametrze konstruktora deklaruje właściwość i przypisuje ją w jednym kroku: public function __construct(private string $name) {} to to samo co zadeklarowanie private string $name; i napisanie $this->name = $name; w treści.
Czy klasa w PHP może mieć kilka konstruktorów?
Nie. PHP nie ma przeciążania metod, więc klasa ma jeden __construct. Użyj parametrów opcjonalnych z wartościami domyślnymi albo dodaj statyczne metody fabryczne, takie jak public static function fromArray(array $data): static, które wywołują new static(...) z właściwymi argumentami.
Czy konstruktor rodzica jest wywoływany automatycznie w PHP?
Tylko wtedy, gdy klasa potomna nie ma własnego konstruktora. Jeśli potomek definiuje __construct, konstruktor rodzica nie wykona się, dopóki sam nie wywołasz parent::__construct(...), zwykle w pierwszej linii.
Czy konstruktor w PHP może zwrócić wartość?
Nie. new zawsze daje obiekt, a to, co zwróci __construct, jest ignorowane. Aby zgłosić problem, rzuć wyjątek z konstruktora, na przykład throw new InvalidArgumentException('Age must be positive').