Programowanie obiektowe w PHP4 i PHP5 11 2005


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 11
Programowanie Obiektowe Ćwiczenia 5
[C ]Rataj Podstawy programowania obiektowego
Programowanie Obiektowe W Visual Basic Net Dla Ka dego
JavaScript Programowanie obiektowe
Programowanie obiektowe pojęcia
Podstawy Programowania 04 Programowanie Obiektowe
Jezyk C?ektywne programowanie obiektowe cpefpo
Program rozwoju kultury Woj Podkarpackiego 2005 2009 (PL)
Programowanie Obiektowe W Pythonie
świerszczyński,programowanie obiektowe,Konstruktory i destruktory
Programowanie obiektowe i C
PHP profesjonalnie programowanie obiektowe i narzędzia programisty 08 2006

więcej podobnych podstron