Konstruktorji

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.