Klasy i ObiektyPodręcznik PHPPoprzedniNastępnyRozdział 14. Klasy i ObiektySpis treściklasaextendsKonstruktory::parentSerializacja obiektów - obiekty w sesjachMagiczne funkcje __sleep i __wakeupReferencje wewnątrz konstruktoraklasa
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
PoprzedniSpis treściNastępnyZmienne funkcjePoczątek rozdziałuextends