Konstruktory

Uwaga !

Konstruktory zachowują się inaczej w PHP 3 i w PHP 4 . Semantyka PHP 4 jest mocno zalecana .

Konstruktory funkcjami klasy , które 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 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 funkcjami , które wywoływanie automatycznie kiedy obiekty niszczone albo przez użycie unset( ) albo przez wyjście z zasięgu . W PHP nie ma destruktorów .