Konstruktory

Uwaga!

Konstruktory zachowuj▒ siΩ inaczej w PHP 3 i w PHP 4. Semantyka PHP 4 jest mocno zalecana.

Konstruktory s▒ funkcjami klasy, kt≤re s▒ automatycznie wywo│ywane przy tworzeniu nowej instancji klasy korzystaj▒c z operatora new. W PHP 3 funkcja staje siΩ konstruktorem kiedy ma tak▒ sam▒ nazwΩ jak klasa. W PHP 4 funkcja staje siΩ konstruktorem, kiedy ma tak▒ sam▒ nazwΩ jak klasa, w kt≤rej ta funkcja zosta│a zdefiniowana - r≤┐nica jest subtelna, ale bardzo wa┐na (zobacz poni┐ej)

// Dzia│a w PHP 3 i PHP 4.
class Auto_Koszyk extends Koszyk
{
    function Auto_Koszyk()
    {
        $this->dodaj_artykul ("10", 1);
    }
}

Ten kod definiujΩ klasΩ Auto_Koszyk, kt≤ry jest klas▒ Koszyk pluc konstruktor, kt≤ry inicjalizuje w≤zek z jednym artyku│em "10" za ka┐dym razem, kiedy Auto_Koszyk jest tworzony operatorem "new". Konstruktory mog▒ pobieraµ argumenty i te argumenty mog▒ byµ opcjonalne, przez co s▒ jeszcze bardziej u┐yteczne. Aby w dalszym ci▒gu m≤c u┐ywaµ klasy bez parametr≤w, wszystkie parametry konstruktora powinny staµ siΩ opcjonalne przez dodanie domy╢lnych warto╢ci.

// Dzia│a w PHP 3 i PHP 4.
class Kontruktor_Koszyk extends Koszyk
{
    function Konstruktor_Koszyk($artykul = "10", $ilosc = 1)
    {
        $this->dodaj_artykul ($artykul, $ilosc);
    }
}
 
// Kup te same nudne rzeczy...
 
$zwykly_koszyk = new Konstruktor_Koszyk;
 
// Czas na prawdziwe zakupy...
 
$inny_koszyk = new Konstruktor_Koszyk("20", 17);

Mo┐esz tak┐e u┐yµ operatora @ aby wyciszyµ b│Ωdy zachodz▒ce w konstruktorze, np. @new

Uwaga!

W PHP 3, dziedziczone klasy i konstruktory maj▒ wiele ogranicze±. Poni┐sze przyk│ady powinny byµ dok│adnie przeczytane w celu zrozumienia tych ogranicze±.

class A
{
    function A()
    {
      echo "Jestem konstruktorem klasy A.<br>\n";
    }
}

class B extends A
{
    function C()
    {
        echo "Zwyk│a funkcja.<br>\n";
    }
}

// W PHP 3 nie zostanie wywo│any ┐aden konstruktor.
$b = new B;

W PHP 3 w powy┐szym przyk│adzie nie bΩdzie wywo│any ┐aden konstruktor. Zasad▒ PHP 3 jest: 'Konstruktor to funkcja o takiej samej nazwie jak klasa'. Nazw▒ klasy jest B, a w klasie B nie ma funkcji o nazwie B(). Nic siΩ nie dzieje.

Zosta│o to poprawione w PHP 4 przez wprowadzenie innej zasady: je╢li klasa nie ma konstruktora, u┐ywany jest konstruktor klasy bazowej, je╢li taki istnieje. W PHP 4 powy┐szy przyk│ad wy╢wietli 'Jestem konstruktorem klasy A.<br>'.

class A
{
    function A()
    {
        echo "Jestem konstruktorem klasy A.<br>\n";
    }

    function B()
    {
        echo "Jestem zwyk│▒ funkcj▒ o nazwie B w klasie A.<br>\n";
        echo "Nie jestem konstruktorem w klasie A.<br>\n";
    }
}

class B extends A
{
    function C()
    {
        echo "Jestem zwyk│▒ funkcj▒.<br>\n";
    }
}

// Wywo│a to B() jako konstruktor.
$b = new B;

W PHP 3, funkcja B() z klasy A niespodziewanie stanie siΩ konstruktorem w klasie B, pomimo ┐e wcale nie mia│a nim byµ. Zasad▒ PHP 3 jest: 'Konstruktor to funkcja o takiej samej nazwie co klasa'. PHP 3 nie obchodzi czy funkcja zosta│a zdefiniowana w klasie B czy zosta│a odziedziczona.

Zosta│o to poprawione w PHP 4 przez modyfikacjΩ tej zasady do: 'Konstruktor to funkcja o tej samej nazwie co klasa w kt≤rej zosta│a zdefiniowana'. W zwi▒zku z tym w PHP 4 clasa B nie mia│aby w│asnego konstruktora. Wywo│any by│by tylko konstruktor klasy bazowej, wy╢wietlaj▒c 'Jestem konstruktorem klasy A.<br>'.

Uwaga!

Ani PHP 3 ani PHP 4 nie wywo│a automatycznie konstruktora klasy bazowej z kontruktora klasy pochodnej. Twoim zadaniem jest propagacja wywo│a± konstruktor≤w klas nadrzΩdnych, je╢li to konieczne.

Notatka: Ani w PHP 3 ani w PHP 4 nie ma destruktor≤w. Zamiast tego mo┐esz u┐yµ register_shutdown_function() aby symulowaµ dzia│anie destruktor≤w.

Destruktory s▒ funkcjami, kt≤re s▒ wywo│ywanie automatycznie kiedy obiekty s▒ niszczone albo przez u┐ycie unset() albo przez wyj╢cie z zasiΩgu. W PHP nie ma destruktor≤w.