Podręcznik PHP
Poprzedni
Rozdział 14.
Klasy i Obiekty
Następny
Konstruktory
Uwaga!
Konstruktory zachowują się inaczej w PHP 3 i w PHP 4.
Semantyka PHP 4 jest mocno zalecana.
Konstruktory są funkcjami klasy, które są automatycznie wywoływane przy tworzeniu nowej instancji klasy korzystając z operatora new.
W PHP 3 funkcja staje się konstruktorem kiedy ma taką samą nazwę jak klasa.
W PHP 4 funkcja staje się konstruktorem, kiedy ma taką samą nazwę jak klasa, w której ta funkcja została zdefiniowana - różnica jest subtelna, ale bardzo ważna (zobacz poniżej)
/ / Działa w PHP 3 i PHP 4. class Auto_Koszyk extends Koszyk {function Auto_Koszyk() {$this - dodaj_artykul ("10", 1);}}
Ten kod definiuję klasę Auto_Koszyk, który jest klasą Koszyk pluc konstruktor, który inicjalizuje wózek z jednym artykułem "10" za każdym razem, kiedy Auto_Koszyk jest tworzony operatorem "new ".
Konstruktory mogą pobierać argumenty i te argumenty mogą być opcjonalne, przez co są jeszcze bardziej użyteczne.
Aby w dalszym ciągu móc używać klasy bez parametrów, wszystkie parametry konstruktora powinny stać się opcjonalne przez dodanie domyślnych wartości.
/ / Działa w PHP 3 i PHP 4. class Kontruktor_Koszyk extends Koszyk {function Konstruktor_Koszyk($artykul = "10", $ilosc = 1) {$this - dodaj_artykul ($artykul, $ilosc);}} / / Kup te same nudne rzeczy... $zwykly_koszyk = new Konstruktor_Koszyk; / / Czas na prawdziwe zakupy... $inny_koszyk = new Konstruktor_Koszyk("20", 17);
Możesz także użyć operatora @ aby wyciszyć błędy zachodzące w konstruktorze, np. @new
Uwaga!
W PHP 3, dziedziczone klasy i konstruktory mają wiele ograniczeń.
Poniższe przykłady powinny być dokładnie przeczytane w celu zrozumienia tych ograniczeń.
class A {function A() {echo "Jestem konstruktorem klasy A. br \n";}} class B extends A {function C() {echo "Zwykła funkcja. br \n";}} / / W PHP 3 nie zostanie wywołany żaden konstruktor. $b = new B;
W PHP 3 w powyższym przykładzie nie będzie wywołany żaden konstruktor.
Zasadą PHP 3 jest: 'Konstruktor to funkcja o takiej samej nazwie jak klasa'.
Nazwą klasy jest B, a w klasie B nie ma funkcji o nazwie B().
Nic się nie dzieje.
Zostało to poprawione w PHP 4 przez wprowadzenie innej zasady: jeśli klasa nie ma konstruktora, używany jest konstruktor klasy bazowej, jeśli taki istnieje.
W PHP 4 powyższy przykład wyświetli 'Jestem konstruktorem klasy A. br'.
class A {function A() {echo "Jestem konstruktorem klasy A. br \n";} function B() {echo "Jestem zwykłą funkcją o nazwie B w klasie A. br \n"; echo "Nie jestem konstruktorem w klasie A. br \n";}} class B extends A {function C() {echo "Jestem zwykłą funkcją. br \n";}} / / Wywoła to B() jako konstruktor. $b = new B;
W PHP 3, funkcja B() z klasy A niespodziewanie stanie się konstruktorem w klasie B, pomimo że wcale nie miała nim być.
Zasadą PHP 3 jest: 'Konstruktor to funkcja o takiej samej nazwie co klasa'.
PHP 3 nie obchodzi czy funkcja została zdefiniowana w klasie B czy została odziedziczona.
Zostało to poprawione w PHP 4 przez modyfikację tej zasady do: 'Konstruktor to funkcja o tej samej nazwie co klasa w której została zdefiniowana'.
W związku z tym w PHP 4 clasa B nie miałaby własnego konstruktora.
Wywołany byłby tylko konstruktor klasy bazowej, wyświetlając 'Jestem konstruktorem klasy A. br'.
Uwaga!
Ani PHP 3 ani PHP 4 nie wywoła automatycznie konstruktora klasy bazowej z kontruktora klasy pochodnej.
Twoim zadaniem jest propagacja wywołań konstruktorów klas nadrzędnych, jeśli to konieczne.
Notatka:
Ani w PHP 3 ani w PHP 4 nie ma destruktorów.
Zamiast tego możesz użyć register_shutdown_function() aby symulować działanie destruktorów.
Destruktory są funkcjami, które są wywoływanie automatycznie kiedy obiekty są niszczone albo przez użycie unset() albo przez wyjście z zasięgu.
W PHP nie ma destruktorów.
Poprzedni
Spis treści
Następny
Początek rozdziału