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 s▒ 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 s▒ typami, kt≤re s▒ 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 s▒ do koszyka $inny_koszyk.

I $koszyk i $inny_koszyk maj▒ funkcje dodaj_produkt(), usun_produkt() i zmienne. S▒ 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