KonstruktoryPodręcznik PHPPoprzedniRozdział 14. Klasy i ObiektyNastępnyKonstruktoryUwaga!
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.
PoprzedniSpis treściNastępnyextendsPoczątek rozdziału::
Wyszukiwarka
Podobne podstrony:
language oop constructorlanguage oop constructorlanguage ooplanguage ooplanguage oop magic functionslanguage oop serializationlanguage oop serializationlanguage oop newreflanguage oop newreflanguage oop newreflanguage oop magic functionslanguage ooplanguage oop serializationwięcej podobnych podstron