Rozdział 14 . Klasy i Obiekty

Spis treści
klasa
extends
Konstruktory
::
parent
Serializacja obiektów - obiekty w sesjach
Magiczne funkcje __sleep i __wakeup
Referencje wewnątrz konstruktora

klasa

Klasa jest to zbiór zmiennych i funkcji operujących na tych zmiennych . Do definicji klasy używana jest następująca składnia :

 
?php

 
class

 
Koszyk

 
{

 
var

 
$zakupy

 
;

 
/

 
/

 
Zakupy

 
w

 
naszym

 
koszyku

 
/

 
/

 
Dodaj

 
$num

 
artykułów

 
typu

 
$artnr

 
do

 
wózka

 
function

 
dodaj_produkt

 
($artnr

 
,

 
$num

 
)

 
    {

 
$this

 
-

 
zakupy[$artnr

 
]

 
+=

 
$num

 
;

 
    }

 
/

 
/

 
Usuń

 
$num

 
artykułów

 
typu

 
$artnr

 
z

 
wózka

 
function

 
usun_produkt

 
($artnr

 
,

 
$num

 
)

 
    {

 
if

 
($this

 
-

 
zakupy[$artnr

 
]

 
$num

 
)

 
{

 
$this

 
-

 
zakupy[$artnr

 
]

 
-=

 
$num

 
;

 
return

 
true

 
;

 
}

 
else

 
{

 
return

 
false

 
;

 
}

 
}

 
}

 
?





Definiuje to klasę o nazwie Koszyk , która zawiera tablicę asocjacyjną artykułów znajdujących się w wózku i dwie funkcje do dodawania i usuwania produktów z koszyka .

Uwaga !

Poniższe uwagi dotyczą PHP 4 .

Nazwa stdClass jest używana wewnętrznie przez Zend i jest zarezerwowana . W PHP nie możesz zdefiniować klasy o nazwie stdClass .

Nazwy funkcji __sleep i __wakeup mają magiczne znaczenie dla klas w PHP . Klasy nie mogą zawierać funkcji o tych nazwach , chyba że zgadzasz się na przypisanie do nich magicznej funkcjonalności . Poniżej możesz znaleźć więcej informacji .

PHP rezerwuje wszystkie nazwy funkcji zaczynające się od __ na funkcje magiczne . Zalecane jest nieużywanie funkcji z nazwami zaczynającymi się od __ chyba że chcesz jakiejś magicznej funkcjonalności .

Notatka : W PHP 4 dozwolone tylko stałe inicjalizatory zmiennych var . Aby zainicjalizować zmienne z nie-stałymi wartościami , potrzebujesz funkcję inicjalizacyjną , która jest wywoływana automatycznie zaraz po utworzeniu obiektu z danej klasy . Taka funkcja zwana jest konstruktorem ( zobacz poniżej ) .

 
?php

 
/

 
*

 
Nic

 
z

 
tego

 
nie

 
będzie

 
działać

 
w

 
PHP

 
4

 
.

 
*

 
/

 
class

 
Koszyk

 
{

 
var

 
$dzisiejsza_data

 
=

 
date("Y-m-d")

 
;

 
var

 
$nazwa

 
=

 
$imie

 
;

 
var

 
$wlasciciel

 
=

 
'Fred

 
'

 
.

 
'Jones'

 
;

 
var

 
$artykuly

 
=

 
array("VCR"

 
,

 
"TV")

 
;

 
}

 
/

 
*

 
Teraz

 
wszystko

 
zadziala

 
.

 
*

 
/

 
class

 
Koszyk

 
{

 
var

 
$dzisiejsza_data

 
;

 
var

 
$nazwa

 
;

 
var

 
$wlasciciel

 
;

 
var

 
$artykuly

 
;

 
function

 
Cart(

 
)

 
    {

 
$this

 
-

 
dzisiejsza_data

 
=

 
date("Y-m-d")

 
;

 
$this

 
-

 
nazwa

 
=

 
$GLOBALS['imie']

 
;

 
/

 
*

 
itp

 
.

 
.

 
.

 
*

 
/

 
    }

 
    }

 
?



Klasy typami , które w zasadzie tylko schematami dla właściwych zmiennych . Zmienne pożądanego typu musisz stworzyć korzystając z operatora new .

 
 ?php

 
$koszyk

 
=

 
new

 
Koszyk

 
;

 
$koszyk

 
-

 
dodaj_produkt("10"

 
,

 
1)

 
;

 
$inny_koszyk

 
=

 
new

 
Koszyk

 
;

 
$inny_koszyk

 
-

 
dodaj_produkt("0815"

 
,

 
3)

 
;



Kod ten tworzy obiekty $koszyk i $inny_koszyk , oba klasy Koszyk . Funkcja dodaj_produkt( ) obiektu $koszyk zostaje wywołana w celu dodania 1 artykułu typu "10 " do koszyka $koszyk . 4 przedmioty typu " 0815 " dodawane do koszyka $inny_koszyk .

I $koszyk i $inny_koszyk mają funkcje dodaj_produkt( ) , usun_produkt( ) i zmienne . to osobne funkcje i zmienne . Obiekty mogą być postrzegane jako katalogi w systemie plików . W systemie plików możesz mieć dwa różne pliki README.TXT , ale tylko jeśli istnieją w osobnych katalogach . Aby odczytać plik , będąc w głównym katalogu , musisz podać pełną ścieżkę do tego pliku . Tak samo jest przy obiektach : musisz podać pełną nazwę funkcji , z której chcesz skorzystać . W terminologii PHP katalogiem głównym będzie globalna przestrzeń nazw a separatorem ścieżki będzie - . W związku z tym nazwy $koszyk i $inny_koszyk zawierają zupełnie inne zmienne . Zauważ , że zmienna nazywa się $koszyk - artykuly , a nie $koszyk - $artykuly , ponieważ nazwa zmiennej może zawierać tylko jeden znak dolara .

 
/

 
/

 
poprawnie

 
,

 
jeden

 
$

 
$koszyk

 
-

 
artykuly

 
=

 
array(

 
"10

 
"

 
=

 
1)

 
;

 
/

 
/

 
niepoprawnie

 
,

 
poniważ

 
$koszyk

 
-

 
$artykuly

 
zamienia

 
się

 
na

 
$koszyk

 
-

 
"

 
"

 
$koszyk

 
-

 
$artykuly

 
=

 
array("10

 
"

 
=

 
1)

 
;

 
/

 
/

 
poprawnie

 
,

 
ale

 
może

 
(ale

 
nie

 
musi

 
)

 
nie

 
być

 
tym

 
,

 
co

 
zamierzaliśmy

 
:

 
/

 
/

 
$koszyk

 
-

 
$zmienna

 
staje

 
się

 
$koszyk

 
-

 
artykuly

 
$zmienna

 
=

 
'artykuly'

 
;

 
$koszyk

 
-

 
$zmienna

 
=

 
array("10

 
"

 
=

 
1)

 
;



Wewnątrz definicji klasy , nie wiesz pod jaką nazwą obiekt będzie dostępny dla twojego programu : w momencie pisania klasy Koszyk , nie było wiadomo , że obiekty będą się nazywać $koszyk lub $inny_koszyk . W związku z tym nie możesz napisać $koszyk - artykuly wewnątrz klasy Koszyk . Zamiast tego , aby uzyskać dostęp do funkcji i zmiennych zawartych w klasie , można użyć pseudo-zmiennej $this , która może być odczytana jako ' moje własne ' lub 'bieżący obiekt ' . A więc ' $this - artykuly[$nrart ] += $liczba ' może być odczytane jako 'dodaj $liczba do licznika $nrart z mojej własnej tablicy artykuly ' lub 'dodaj $liczba do licznika $nrartz tablicy artykuly zawartej w bieżącym obiekcie ' .

Notatka : Istnieje kilka przyjemnych funkcji do obsługi klas i obiektów . Możesz je zobaczyć w rozdziale Funkcje obsługi klas i obiektów