Figyelem |
A PHP 3 és PHP 4 konstruktorok különbözőképpen működnek. A PHP 4 megvalósítása erősen javasolt. |
A konstruktorok az osztályok olyan metódusai, amelyek automatikusan meghívásra kerülnek egy új objektumpéldány new kulcsszóval történő létrehozása során. A PHP 3-ban egy metódus akkor tekinthető konstruktornak, ha a neve megyezik az osztály nevével. A PHP 4-ben egy metódus akkor lesz kostruktorrá, hogy a neve megegyezik annak az osztálynak a nevével, ahol deifiniálták. A különbség hajszálnyi, de kritikus (lásd lentebb).
// A PHP 3 és PHP 4 verziókban is működik class Auto_Kosar extends Kosar { function Auto_Kosar () { $this->berak ("10", 1); } } |
Ez egy olyan Auto_Kosar nevű osztályt [objektumtípust] hoz létre, mint a Kosar, csak rendelkezik egy konstruktorral, amely inicializálja a kosarat 1 darab "10"-es áruval, valahányszor a new operátorral hozzuk létre az objektumot. [de csak akkor!!!] A konstruktoroknak is lehet átadni paramétereket, és ezek lehetnek elhagyhatók is, amely még hasznosabbá teszi őket. Ha paraméterek nélkül is használható osztályt szeretnél, állíts be minden paraméternek alapértéket.
// A PHP 3 és PHP 4 verziókban is működik class Konstruktoros_Kosar extends Kosar { function Konstruktoros_Kosar ($sorsz = "10", $db = 1) { $this->berak ($sorsz, $db); } } // Mindig ugyanazt az uncsi dolgot veszi... $kiindulo_kosar = new Konstruktoros_Kosar; // Igazi vásárlás $masik_kosar = new Konstruktoros_kosar ("20", 17); |
Az @ operátor használatával elnémíthatók a konstruktorban fellépő hibák, használata ilyen esetben: @new.
Figyelem |
A PHP 3-ban a leszármazott osztályokra és konstrukrotokra számos korlátozás van. Az alábbi példákat érdemes alaposan áttekinteni, hogy megértsd ezeket a korlátozásokat. |
class A { function A() { echo "Én vagyok az A osztály konstruktora.<br>\n"; } } class B extends A { function C() { echo "Én egy metódus vagyok.<br>\n"; } } // PHP 3-ban semmilyen konstruktor sem kerül meghívásra $b = new B; |
PHP 3-ban semmilyen konstruktor sem kerül meghívásra a fenti példában. A PHP 3 szabálya a következő: 'A konstruktor egy metódus, aminek ugyanaz a neve, mint az osztálynak'. Az osztály neve B, és nincs B() nevű metódus a B osztályban. Semmi sem történik.
Ez a PHP 4-ben ki van javítva egy másik szabály bevezetésével: Ha az osztályban nincs konstruktor, a szülő osztály konstruktora hívódik meg, ha létezik. A fenti példa kimenete 'Én vagyok az A osztály konstruktora.<br>' lett volna PHP 4-ben.
class A { function A() { echo "Én vagyok az A osztály konstruktora.<br>\n"; } function B() { echo "Én egy B nevű metódus vagyok az A osztályban.<br>\n"; echo "Nem vagyok A konstruktora.<br>\n"; } } class B extends A { function C() { echo "Én egy metódus vagyok.<br>\n"; } } // Ez meghívja B()-t, mint konstruktort $b = new B; |
A PHP 3-ban az A osztály B() metódusa hirtelen konstruktorrá válik a B osztályban, habár ez soha sem volt cél. A PHP 3 szabálya: 'A konstruktor egy metódus, aminek ugyanaz a neve, mint az osztálynak'. A PHP 3 nem foglalkozik azzal, hogy a metódus a B osztályban van-e definiálva, vagy öröklés útján áll rendelkezésre.
Ez a PHP 4-ben ki van javítva egy másik szabály bevezetésével: 'A konstruktor egy metódus, aminek ugyanaz a neve, mint az osztálynak, ahol deifiniálták'. Ezért a PHP 4-ben a B osztálynak nincs saját konstruktora, így a szülő osztály kostruktora hívódik meg, kiírva, hogy 'Én vagyok az A osztály konstruktora.<br>'.
Figyelem |
Sem a PHP 3, sem a PHP 4 nem hívja meg a szülő osztály konstruktorát automatikusan egy leszármazott osztály definiált konstruktorából. A te feladatod, hogy meghívd a szülő konstruktorát, ha szükséges. |
Megjegyzés: Nem léteznek destruktorok sem a PHP 3 sem a PHP 4 verzióiban. Bár használhatod a register_shutdown_function() függvényt a destruktorok legtöbb viselkedésének eléréséhez.
A destruktor olyan metódus, ami automatikusan meghívódik, amikor egy objektum megszűnik, akár az unset() meghívásával, akár a környezete megszűnése miatt. PHP-ben nincsenek destruktorok.