CMYK
NA CD NEWSY Z OKŁADKI FIRMA MAGAZYN PROGRAMY WEBMASTERING
PHP
PROGRAMOWANIE
OBIEKTOWE
Część I
w PHP4 i PHP5
Na przestrzeni ostatnich lat programowanie obiektowe w PHP
uległo istotnym zmianom. Wersja 3 zawierała jedynie namiastkę
obiektowoSci, PHP4 wspiera programowanie obiektowe w znacznym
stopniu, ale dopiero wersja 5 jest językiem obiektowym w pełnym
UWAGA! Dwie
pozostałe części
tego słowa znaczeniu. W trzech odcinkach omówimy podstawy
tego artykułu,
programowania obiektowego w PHP, zbadamy możliwoSci PHP4
wraz z listingami
w dziedzinie obiektowoSci oraz pokażemy nowoSci
i przykładami,
są dostępne na płycie
wprowadzone w PHP5.
CD oraz w naszym
serwisie internetowym:
www.mi.com.pl
Włodzimierz Gajda
Podstawy programowania obiektowego w PHP
WYMAGANA WIEDZA
Klasy i obiekty //definicja typu
Klasa i obiekt to dwa kluczowe pojęcia towarzyszące progra- class ALAMAKOTA {
l
mowaniu obiektowemu. Pisanie kodu obiektowego polega na }
znajomość PHP
definiowaniu klas, związków i relacji między nimi oraz ma- //utworzenie zmiennej
na poziomie
nipulowaniu obiektami. Klasa jest typem danych, zaS obiekt $z2 = new ALAMAKOTA;
podstawowym
zmienną. //sprawdzenie typu zmiennej
W języku PHP na ogół nie deklarujemy typu zmiennej. var_dump($z2);
JeSli zmienna przechowuje liczbę czy napis, to w skrypcie
CZEGO SIĘ DOWIESZ
nie występuje jawne ustalenie typu. Typ zmiennej wynika zawiera definicję typu ALAMAKOTA oraz zmienną $z2.
Z TEGO ARTYKUŁU?
z wykonanych na niej operacji. Tym razem w przeglądarce pojawi się tekst object(alama-
Do sprawdzenia typu zmiennej stosujemy funkcję kota), który mówi o tym, że obiekt $z2 jest typu obiekto-
l
var_dump(). Po wykonaniu poniższego kodu zmienna wego ALAMAKOTA.
jakie możliwości
$z1 będzie typu int, o czym przekona uzyskany Pomiędzy powyższymi przykładami należy odnoto-
niesie za sobą PHP5
wydruk: wać dwie różnice. Typ int jest predefiniowany i nie mu-
pod względem
simy pisać jego definicji, podczas gdy klasa ALAMA-
programowania
$z1 = 123; KOTA musi być zawarta w skrypcie. Druga różnica po-
obiektowego
var_dump($z1); lega na tym, że typ zmiennej $z1 zostaje ustalony na
l
podstawie wartoSci 123 przypisanej do zmiennej, zaS
jakie są różnice
W przeglądarce pojawi się tekst int(123) informujący w odniesieniu do obiektu $z2 nazwa typu ALAMAKO-
w programowaniu
o typie (int) i wartoSci (123) zmiennej $z1. W powyższym TA zostaje podana jawnie.
przykładzie występuje zatem typ int oraz zmienna $z1, obiektowym w PHP4 W dwóch przedstawionych przykładach występują:
przy czym typ int pojawia się w sposób niejawny: wynika typ int i zmienna $z1 oraz typ ALAMAKOTA
i PHP5
on z wartoSci przypisanej do zmiennej. i zmienna $z2.
W przypadku zmiennych będących obiektami sprawa W stosunku do typów i zmiennych obiektowych sto-
wygląda odmiennie. Tworząc obiekt musimy podać nazwę klasy (czyli sujemy terminologię klasa i obiekt. Mówimy klasa ALAMAKO-
typ zmiennej). Kod obiektowy: TA oraz obiekt $z2 .
102 INTERNET.listopad.2005
CMYK
WEBMASTERING PROGRAMY MAGAZYN FIRMA Z OKŁADKI NEWSY NA CD
PHP
Definicja klasy Obiekty instancje klasy
Definicja klasy w języku PHP jest następująca: Jak już powiedzieliSmy, obiekt jest zmienną, której typ jest klasą.
Obiekty tworzymy nieco inaczej niż zmienne skalarne. W przypadku
class A { zwykłych zmiennych wystarczy instrukcja przypisania:
//składowe klasy
} $imie = Jan ;
Po słowie kluczowym class umieszczamy nazwę klasy, zaS natomiast w przypadku obiektu stosujemy operator new, po którym
pomiędzy nawiasami klamrowymi składowe klasy, którymi podajemy nazwę klasy. JeSli w skrypcie pojawia się definicja klasy A,
w PHP są pola oraz metody. Pola to zmienne, w których prze- wówczas utworzenie obiektu podanego typu przyjmie postać:
chowujemy dane, natomiast metody to funkcje przetwarzające
obiekt. KolejnoSć pól i metod w definicji klasy może być $ob = new A;
dowolna, warto jednak stosować ogólnie przyjętą konwencję
i umieszczać na początku klasy wszystkie pola, po nich zaS Mówimy obiekt $ob klasy A lub nazywamy zmienną $ob. in-
metody. stancją klasy A czy też egzemplarzem klasy A .
W częSci języków programowania składową klasy może być
także właSciwoSć specjalne pole, do którego dostęp powoduje Dostęp do pól i metod
wywołanie dodatkowych metod. W PHP4 właSciwoSci nie występu- Do składowych klasy odwołujemy się operatorem ->. JeSli klasa A ma pola
ją w ogóle, zaS w PHP5 do definiowania właSciwoSci możemy użyć $pole1, $pole2 oraz metody fun1() i fun2(), wówczas po utworzeniu obiektu
funkcji _get() oraz _set(). Termin właSciwoSć jest stosowany także $tmp możemy przypisywać wartoSci do pól i wywoływać metody:
w odniesieniu do zwykłych pól klasy.
Ponieważ w PHP5 pojawiły się specyfikatory dostępu, definicja $tmp = new A;
składowych klasy nieco różni się w językach PHP4 oraz PHP5. $tmp->pole1 = Ala ma kota ;
Teraz omówimy definiowanie składowych klasy w języku PHP4, $tmp->fun1();
zaS zagadnienia dotyczące PHP5 przedstawimy w dalszej częSci,
w punkcie zatytułowanym Specyfikatory dostępu . Zwróćmy uwagę na fakt, że znak dolara pojawia się zawsze jeden raz
Definicja pola w języku PHP4 składa się ze słowa kluczowego przed zmienną. W stosunku do pola $pole1 poprawnym odwołaniem jest:
var, po którym następuje nazwa poprzedzona znakiem dolara. Kla-
sa może zawierać dowolną liczbę pól, których nazwy muszą być $tmp->pole1 = Ala ma kota ;
unikalne w ramach klasy. Podobnie jak w przypadku zwykłych
zmiennych, tak i w odniesieniu do pól nie okreSlamy ich typu. podczas gdy instrukcja:
WartoSci pól możemy inicjalizować stałymi, nie możemy natomiast
stosować do tego celu wyrażeń. PRZYKŁAD NIEPOPRAWNY
Definicja metody nie różni się niczym od zwykłej definicji $tmp->$pole1 = Ala ma kota ;
funkcji. Warto jednak zaznaczyć, że metody nie mogą być, tak jak
na przykład w C++, przeładowywane. Innymi słowy nazwy metod jest błędna z racji na wystąpienie znaku dolara przed nazwą pola pole1
w obrębie klasy muszą być unikalne. OczywiScie metody analo- (mimo że dolar ten występuje przed nazwą pola w definicji klasy var
gicznie jak zwykłe funkcje mogą zawierać parametry. $pole1;).
Klasa A po dodaniu dwóch pól oraz dwóch metod przyjmie W PHP w wersji 4 wszystkie pola i metody klasy mają zasięg pu-
w PHP4 postać: bliczny. Oznacza to, że możemy odwoływać się do każdego pola
i każdej metody z dowolnego miejsca skryptu.
class A {
var $pole1; Referencja $this
var $pole2; Również wewnątrz definicji metod klasy możemy uzyskiwać dostęp
function fun1() do jej składowych. W tym celu stosujemy referencję $this. Referencja
{ $this jest nazywana w dokumentacji języka PHP pseudozmienną.
//... Odwołania takie mają postać:
}
function fun2() function fun1()
{ {
//... $this->pole1 = 10;
} $this->fun2();
} }
Umieszczenie powyższej klasy wewnątrz skryptu nie spowoduje Pamiętajmy, że odwołania pozbawione referencji $this (takie, które
żadnych widocznych efektów. Definicja klasy jest definicją typu. byłyby poprawne w językach C++ czy w obiektowym Pascalu Srodo-
Ustala ona budowę obiektu: okreSla jego pola i metody. Jednak żaden wiska Delphi) w PHP są niepoprawne. JeSli wewnątrz metody fun1()
konkretny obiekt podanego typu nie jest tworzony, a metody nie są napiszemy:
wywoływane.
Klasy w języku PHP podlegają dwóm ograniczeniom skła- function fun1()
dniowym: {
klasa musi być umieszczona w jednym bloku kodu PHP, $pole1 = 33;
definicje metod muszą znajdować się wewnątrz definicji klasy. }
Chcesz wiedzieć więcej? Zajrzyj na nasze forum:
INTERNET.listopad.2005 103
http://forum.mi.com.pl
CMYK
NA CD NEWSY Z OKŁADKI FIRMA MAGAZYN PROGRAMY WEBMASTERING
PHP
to instrukcja taka spowoduje utworzenie lokalnej zmiennej o nazwie $pole1 definicja klasy zawierającej pola i metody,
wewnątrz funkcji fun1(). WartoSć 33 nie będzie zapisana do pola obiektu, a do tworzenie instancji klasy operatorem new,
zmiennej lokalnej, i zostanie utracona po zakończeniu działania funkcji. Jest to uzyskiwanie dostępu do pól i metod klasy z zewnątrz
doSć powszechny błąd nękający programistów rozpoczynających poznawanie (operator >),
obiektowego PHP. Błąd jest o tyle kłopotliwy, że nie powoduje (w odróżnie- uzyskiwanie dostępu do pól i metod z wnętrza metod klasy
niu do dwóch dolarów $obiekt->$pole) komunikatów ze strony parsera PHP. (referencja $this),
Warto odnotować, że w niektórych przypadkach referencja $this nie konstruktor klasy.
wskazuje obiektu, w którym wystąpiła w definicji. Dzieje się tak w przy- Opisany skrypt jest napisany w wersji 4 języka PHP. Z racji na
padku statycznego wywoływania metod klasy przy użyciu operatora ::. zgodnoSć w dół, skrypt ten będzie działał poprawnie także w wersji 5.
W poniższym kodzie referencja $this wskazuje obiekt b klasy B, a nie, jak Pracę nad skryptem rozpoczynamy od ustalenia składowych klasy,
by się wydawało, obiekt klasy A: czyli jej pól i metod. Klasa o nazwie MenuWierszy będzie zawierała
dwa pola $FIle i $FElementy oraz trzy metody: konstruktor Menu-
class A { Wierszy(), getMenu() i getTresc(). Pola będą przechowywały informa-
var $pole1 = black ; cje dotyczące zawartoSci witryny: liczba wierszyków dostępnych na
function fun1() stronie (pole $FIle), tytuły wierszyków oraz nazwy plików teksto-
{ wych, w których wiersze są zapisane (dwuwymiarowa tablica $FEle-
echo $this->pole1; menty). Konstruktor klasy będzie tworzył obiekt i ustalał wartoSci pól
} na podstawie danych odczytanych z pliku, zaS metody getMenu()
} i getTresc() będą odpowiedzialne za przygotowanie kodu HTML za-
wierającego menu oraz treSć strony. Wydruki generowane przez meto-
class B { dy getMenu() oraz getTresc() będą powstawały na podstawie wartoSci
var $pole1 = white ; pól $FIle oraz $FElementy. Definicja klasy z pominięciem implemen-
function fun2() tacji metod została przedstawiona na listingu 1 .
{ Wewnątrz konstruktora MenuWierszy() oraz metod getMenu()
A::fun1(); i getTresc() możemy operować polami $FIle oraz $FElementy. Stosu-
} jemy w tym celu referencję $this, pisząc:
}
$b = new B; $this->FIle = count($tmp);
$b->fun2();
czy
Powyższa dwuznacznoSć została w PHP5 rozwiązana poprzez za-
kaz stosowania referencji $this wewnątrz metod statycznych. $this->FElementy = array();
Konstruktor w PHP4 Definicję klasy umieszczamy w pliku menuwierszy.class.php i do-
PoSród wszystkich metod danej klasy jedna pełni specjalną rolę. Meto- łączamy do głównego skryptu strona.php instrukcją require_once. Jak
dą tą jest konstruktor. W PHP4 konstruktorem jest metoda o nazwie już wiemy, definicja klasy nie powoduje wykonania żadnego kodu.
identycznej jak klasa, w której występuje. Konstruktor klasy A nazywa Metody klasy, podobnie jak zwykłe funkcje, nie podlegają wykonaniu,
się A i jest zdefiniowany w klasie A: aż do momentu, gdy w skrypcie pojawi się ich wywołanie. W celu wy-
korzystania przygotowanej klasy MenuWierszy musimy utworzyć
class A { obiekt będący instancją podanej klasy:
function A()
{ $menu = new MenuWierszy;
echo ...xxx... ;
} Instrukcja ta tworzy obiekt o nazwie $menu klasy MenuWier-
} szy. Konstruktor klasy jest wywoływany automatycznie podczas
tworzenia obiektu. Obiekt $menu po utworzeniu będzie zawierał
Konstruktor jest wywoływany automatycznie podczas tworzenia wszelkie informacje niezbędne do wygenerowania menu oraz
obiektu. Zatem umieszczenie w kodzie skryptu instrukcji: zawartoSci strony (informacje te są odczytywane z pliku 00in-
dex.log w konstruktorze).
$tmp = new A; Metody getMenu() oraz getTresc() zwracają kod HTML stanowią-
cy menu oraz zawartoSć strony. Wywołanie tych metod umieszczamy
spowoduje wywołanie konstruktora klasy A, skutkiem czego w prze- w odpowiednich miejscach kodu HTML strony głównej. Zarys głów-
glądarce pojawi się tekst ...xxx... . nego skryptu zapisanego w pliku strona.php jest przedstawiony na
Konstruktor, podobnie jak i inne metody, może zawierać parame- listingu 2 .
try. W takim przypadku utworzenie instancji wymaga podania po
nazwie klasy parametrów konstruktora: Zmiany wprowadzone w PHP5
Wersja 5 języka PHP wprowadziła kilka istotnych zmian i rozszerzeń
$ob = new Ksiazka($tytul, $id); dotyczących programowania obiektowego. W stosunku do omówione-
go przykładu rozszerzeniu uległa definicja klasy (wprowadzono specy-
Przykład: Klasa MenuWierszy fikatory dostępu), definicja konstruktora oraz dodano pojęcie destruk-
Przedstawione zagadnienia stanowią pierwszy krok w kierunku pro- tora. Przyjrzymy się poszczególnym zmianom, a następnie zmodyfiku-
gramowania obiektowego i pozwalają na przygotowanie w pełni funk- jemy klasę MenuWierszy tak, by stosowała mechanizmy dostępne
cjonalnych skryptów. Zagadnieniami tymi są: w PHP5.
104 INTERNET.listopad.2005
CMYK
WEBMASTERING PROGRAMY MAGAZYN FIRMA Z OKŁADKI NEWSY NA CD
PHP
Podczas nauki programowania obiektowego w PHP5 warto w kon- Każde odwołanie do pola $pole1 lub metody fun1() nie poprzedzo-
figuracji maszyny PHP wprowadzić wpis: ne referencją $this jest błędne.
Natomiast składowe o zasięgu protected, nazywane chronionymi
error_reporting = E_ALL | E_STRICT (w przykładzie: $pole2 i fun2()), są dostępne wewnątrz klasy (tak jak
składowe prywatne) oraz wewnątrz klas dziedziczących.
który spowoduje drukowanie komunikatów diagnostycznych w przy-
padku stosowania konstrukcji PHP4. Niestety, stała E_ALL nie obej- Konstruktory i destruktory
muje nowo wprowadzonej wartoSci E_STRICT. Stąd koniecznoSć po- Definicja konstruktora w PHP4, wprawdzie nie zalecana, ale ciągle
wyższej modyfikacji. pozostaje zachowana w PHP5. W celu ułatwienia wprowadzania
zmian w nazwach klas, konstruktorem w PHP5 jest metoda o zarezer-
Specyfikatory dostępu wowanej nazwie _construct(). W ten sposób zmiana nazwy klasy nie
Specyfikatorem dostępu jest jedno ze słów kluczowych: public, protec- pociąga za sobą żadnych dodatkowych zmian w kodzie skryptu. Pozo-
ted oraz private. Słowa te umieszczamy bezpoSrednio przed definicją stałe cechy i zachowanie konstruktora (tj. automatyczne wywoływanie
metody lub pola (w przypadku definicji pola pomijamy wówczas podczas tworzenia instancji obiektów) pozostają niezmienione. Kon-
słowo kluczowe var). struktor jest zazwyczaj (poza specyficznymi przypadkami, na przykład
obiektów typu singleton) metodą publiczną.
Pisząc: OczywiScie w klasie nie należy definiować dwóch konstrukto-
rów: jednego zgodnego z PHP4, drugiego z PHP5. W takim przy-
class A { padku wyniki działania kodu będą zależne od wersji PHP. W PHP5
private $pole1; konstruktorem będzie metoda _construct(), zaS w PHP4 metoda
protected $pole2; o nazwie identycznej jak klasa. W przypadku pojawienia się w kla-
public $pole3; sie obydwu konstruktorów parser PHP5 generuje komunikat
var $pole4; E_STRICT. Natomiast stosowanie w PHP5 konstruktorów z PHP4
nie powoduje drukowania komunikatu E_STRICT programista
private function fun1() musi sam o tym pamiętać.
{ Podsumowując, w języku PHP5 konstruktor możemy definiować
} na dwa sposoby: jako metodę o nazwie _construct() lub jako metodę
o nazwie identycznej jak nazwa klasy. Zalecanym rozwiązaniem jest
protected function fun2() stosowanie metody _construct().
{ Dodatkowo w PHP5 po raz pierwszy pojawia się pojęcie destrukto-
} ra. Destruktorem jest metoda o nazwie _destruct(). Jest ona wywoły-
wana automatycznie, gdy obiekt przestaje istnieć.
public function fun3()
{ Klasa MenuWierszy w PHP5
} Wprowadzając do klasy MenuWierszy podane rozszerzenia po pierw-
sze zmodyfikujemy nazwę konstruktora, a po drugie dodamy specyfi-
function fun4() katory dostępu do pól i metod. Wszystkie pola klasy będą polami pry-
{ watnymi, zaS metody metodami publicznymi.
} Klasa MenuWierszy po wprowadzeniu elementów dostępnych
} w PHP5 została zawarta na listingu 3 .
Skrypt główny strona.php zawierający tworzenie instancji oraz wy-
zdefiniujemy klasę A o czterech polach i czterech metodach. wołanie metod getMenu() i getTresc() nie ulegnie zmianie.
Pole $pole3 oraz metoda fun3() są składowymi publicznymi. Z racji na zgodnoSć w dół oba przykłady zawierające klasę Menu-
Do składowych publicznych obiektu możemy odwoływać się Wierszy zostaną poprawnie wykonane przy użyciu PHP w wersji 5.
z dowolnego miejsca w skrypcie. W języku PHP w wersji 4 Natomiast tylko pierwsze z rozwiązań (bez użycia specyfikatorów do-
wszystkie składowe miały zawsze zasięg publiczny. Ze względu stępu) zostanie poprawnie wykonane w PHP4.
na zgodnoSć w dół, pominięcie specyfikatora dostępu w stosunku Tabela 1 zawiera sumaryczne zestawienie podstawowych
do metody oraz użycie słowa kluczowego var w odniesieniu do zagadnień dotyczących programowania obiektowego w PHP z za-
pola działa w PHP5 w identyczny sposób jak w PHP4. Tak dekla- znaczeniem różnic pomiędzy wersjami 4 oraz 5. Natomiast tabela 2
rowane składowe (w powyższej klasie są nimi $pole4 oraz fun4()) zawiera przykłady ilustrujące wszystkie omówione do tej pory
mają zasięg publiczny. W przypadku włączenia komunikatów zagadnienia. n
E_STRICT, parser PHP5 drukuje komunikat o stosowaniu prze-
starzałych rozwiązań (tj. stosowaniu słowa kluczowego var; defi-
Ćwiczenia przedstawione w artykule są dostępne na stronie domowej
niowanie metod bez podawania specyfikatora dostępu nie generu-
autora pod adresem http://www.gajdaw.pl.
je komunikatów E_STRICT).
Składowe $pole1 oraz fun1() są składowymi prywatnymi. Składo-
we o dostępie prywatnym są widoczne jedynie wewnątrz metod danej
UWAGA!
klasy. Zatem do pola $pole1 oraz metody fun1() z powyższego przy-
Dwie pozostałe części tego artykułu,
kładu możemy odwoływać się jedynie wewnątrz metod fun1(), fun2(),
wraz z listingami i przykładami,
fun3() oraz fun4() pisząc:
są dostępne na płycie CD oraz w naszym
serwisie internetowym: www.mi.com.pl
$this->pole1 = ble ;
$this->fun();
INTERNET.listopad.2005 105
Wyszukiwarka
Podobne podstrony:
program seminarium 2010 03 11Programowanie Obiektowe Ćwiczenia 5[C ]Rataj Podstawy programowania obiektowegoProgramowanie Obiektowe W Visual Basic Net Dla Ka degoJavaScript Programowanie obiektoweProgramowanie obiektowe pojęciaPodstawy Programowania 04 Programowanie ObiektoweJezyk C?ektywne programowanie obiektowe cpefpoProgram rozwoju kultury Woj Podkarpackiego 2005 2009 (PL)Programowanie Obiektowe W Pythonieświerszczyński,programowanie obiektowe,Konstruktory i destruktoryProgramowanie obiektowe i CPHP profesjonalnie programowanie obiektowe i narzędzia programisty 08 2006więcej podobnych podstron