Forum und email
Klasy i obiekty (PHP 4)

Rozdział 18. Klasy i obiekty (PHP 4)

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;
        } elseif (
$this->zakupy[$artnr] == $num) {
            unset(
$this->zakupy[$artnr]);
            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.

Ostrzeżenie

NIE jest możliwe rozbicie definicji klasy na wiele plików. Także NIE jest możliwe rozbicie definicji klasy na wiele bloków PHP, chyba że rozbicie to znajduje się wewnątrz definicji metody. Poniższy kod nie będzie działać.

<?php
class test {
?>
<?php
    
function test() {
        print
'OK';
    }
}
?>

Jednakże poniższy kod jest dozwolony:

<?php
class test {
    function
test() {
        
?>
        <?php
        
print 'OK';
    }
}
?>

Poniższe uwagi dotyczą PHP 4.

Uwaga!

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

Uwaga!

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.

Uwaga!

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.

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
class Koszyk {
/* Nic z tego nie będzie działać w PHP 4. */
    
var $dzisiejsza_data = date("Y-m-d");
    var
$nazwa = $imie;
    var
$wlasciciel = 'Fred ' . 'Jones';
/* Jednakże tablice zawierające stałe - będą */
    
var $artykuly = array("VCR", "TV");
}

/* Teraz wszystko zadziala. */
class Koszyk {
    var
$dzisiejsza_data;
    var
$nazwa;
    var
$wlasciciel;
    var
$artykuly = array("VCR", "TV");

    function
Koszyk() {
        
$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. 3 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.

<?php
// 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, czy obiekty będą się nazywać $koszyk, $inny_koszyk, lub inaczej. 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: The $this pseudo-variable is not usually defined if the method in which it is hosted is called statically. This is not, however, a strict rule: $this is defined if a method is called statically from within another object. In this case, the value of $this is that of the calling object. This is illustrated in the following example:

<?php
class A
{
    function
foo()
    {
        if (isset(
$this)) {
            echo
'$this is defined (';
            echo
get_class($this);
            echo
")\n";
        } else {
            echo
"\$this is not defined.\n";
        }
    }
}

class
B
{
    function
bar()
    {
        
A::foo();
    }
}

$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>

Powyższy przykład wyświetli:

$this is defined (a)
$this is not defined.
$this is defined (b)
$this is not defined.

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.