Konstruktor

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.