Opozorilo |
Obnašanje konstruktorjev v PHP 3 in PHP 4 je različno. Obnašanje v PHP 4 je seveda boljše. |
Konstruktorji so funkcije v razredu, ki so klicat+ne avtomatsko, ko ustvarite novo instanco razreda z new. V PHP 3 funkcija postane konstruktor, ko ima isto ime kot razred. V PHP 4 funkcija postane konstruktor, ko ima isto ime kot razred v katerem je definirana - razlika je majhna a pomembna.
// Dela v PHP 3 in PHP 4. class Auto_Cart extends Cart { function Auto_Cart() { $this->add_item ("10", 1); } } |
Zgornja koda definira razred Auto_Cart, torej Cart in konstruktor, ki inicializira Cart z novim predmetom, ki ima številko artikla "10", vsakič ko ga ustvarimo z "new". Konstruktorji imajo lahko tudi argumente, kar jim seveda poveča uporabnost. Da bi lahko uporabili razred brez parametrov, definiramo argumente kot neobvezne z definiranjem privzetih vrednosti.
// Dela v PHP 3 in PHP 4. class Constructor_Cart extends Cart { function Constructor_Cart($item = "10", $num = 1) { $this->add_item ($item, $num); } } // Tukaj dobi privzete vrednosti. $default_cart = new Constructor_Cart; // Tukaj podamo argumente konstruktorju $different_cart = new Constructor_Cart("20", 17); |
Uporabite lahko tudi @ operator, da preprečite izpisovanje morebitnih napak v konstruktorju, recimo @new.
Opozorilo |
V PHP 3 imajo izpeljani razredi in konstruktorji veliko omejitev. Za boljše razumevanje si pazljivo preberite naslednje primere. |
class A { function A() { echo "Jaz sem konstruktor razreda A.<br>\n"; } } class B extends A { function C() { echo "Jaz sem navadna funkcija.<br>\n"; } } // V PHP 3 se konstruktor ne bo klical $b = new B; |
V PHP 3 se konstruktor ne bo klical v zgornjem primeru. Pravilo v PHP 3 je: 'Konstruktor je funkcija, ki ima isto ime kot razred.'. Razred ima ime B in v tem razredu ni nobene funkcije z imenom B(). Nič se ne zgodi.
To je popravljeno v PHP 4 z novim pravilom: Če razred nima konstruktorja, kličemo konstrukor osnovnega razreda, če ta obstaja. Zgornji primer bi izpisal: 'Jaz sem konstruktor razreda A.<br>' v PHP 4.
class A { function A() { echo "Jaz sem konstruktor razreda A.<br>\n"; } function B() { echo "Jaz sem navadna funkcija B v razredu A.<br>\n"; echo "Jaz nisem konstruktor v razredu A.<br>\n"; } } class B extends A { function C() { echo "Jaz sem navadna funkcija.<br>\n"; } } // To bo klicalo B() kot konstruktor. $b = new B; |
V PHP 3 bo funkcija B() v razredu A postala konstruktor v razredu B, čeprav tega nismo želeli. Pravilo v PHP 3 pravi: 'Konstruktor je funkcija, katere ime je enako imenu razreda.'. PHP 3 ne zanima ali je funkcija definirana v razredu B ali pa je bila podedovana.
To je popravljeno v PHP 4 z spremembno tega pravila v: 'Konstruktor je funkcija, ki ima isto ime kot razred v katerem je definirana.'. Torej v PHP 4, razred B nebi imel konstruktorja in bi klicali konstruktor osnovnega razreda, kar bi izpisalo: 'Jat sem konstruktor razreda A.<br>'.
Opozorilo |
Tako PHP 3 kot PHP 4 ne bosta klicala konstruktorja osnovnega razreda avtomatično iz konstruktorja izpeljanega razreda. Vaša naloga je, da kličete konstruktorje osnovnih razredov kjer to želite. |
Opomba: Destruktorji ne obstajajo v PHP 3 ali PHP 4. Uporabite lahko funkcijo register_shutdown_function(), s katero simulirate efekt destruktorjev.
Destruktorji so funkcije, ki so klicane avtomatsko, ko uničimo razred z funkcijo unset() ali ko gremo ven iz območja. Konstruktorji ne obstajajo v PHP.