Constructors

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 olyan az osztályok olyan metódusai, amelyek automatikusan meghívódnak, amikor létrehozol egy új objektumpéldányt a new kulcsszóval. A PHP 3-ban egy metódus úgy válik konstruktorrá, hogy a neve megyezik az osztály nevével. A PHP 4-ben egy metódus úgy 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, ami 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 lehetnek paramétereik, és ezek lehetnek opcionálisak, ami 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);

    

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 soha sem volt ez a célunk. 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.