Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
PHP5. Tajniki
programowania
Autorzy: Andi Gutmans,
Stig Saether Bakken, Derick Rethans
Tumaczenie: Daniel Kaczmarek (przedmowa,
rozdz. 1, 811), Radosaw Meryk (rozdz. 1216,
dod. AC), Anna Zawadzka (rozdz. 27)
ISBN: 83-7361-856-2
Tytu oryginau: PHP 5 Power Programming
Format: B5, stron: 728
Odkryj potg najnowszej wersji jzyka PHP
Zaawansowane techniki programowania w PHP5
Wzorce projektowe i stosowanie technologii XML i SOAP
Sposoby poprawy wydajnoci aplikacji
Wsppraca z bazami danych
PHP w cigu ostatnich lat sta si jednym z najpopularniejszych jzykw
programowania wykorzystywanych do tworzenia aplikacji internetowych.
Swj sukces zawdzicza prostocie i ogromnym moliwociom, pozwalajcym na pisanie
rozbudowanych aplikacji, znacznie przekraczajcych funkcjonalnoci zwyke portale
i dynamiczne strony WWW. Najnowsza wersja jzyka PHP, oznaczona numerem 5,
to w peni obiektowy jzyk programowania umoliwiajcy realizacj zoonych
projektw. Posiada mechanizmy obsugi plikw XML i protokou SOAP oraz
poprawione i rozbudowane funkcje do komunikacji z bazami danych.
PHP5. Tajniki programowania to napisany przez wsptwrc jzyka PHP5 oraz
dwch doskonaych programistw przewodnik opisujcy ogromne moliwoci tej
platformy. Autorzy przedstawiaj sposoby wykorzystania PHP5 w projektach
informatycznych o dowolnej skali zoonoci. Omawiaj model obiektowy PHP5,
wzorce projektowe, metody korzystania z plikw XML i technologii SOAP oraz techniki
wsppracy z bazami danych. W ksice znajdziesz take szczegowe omwienie
biblioteki PEAR, obsugi wyjtkw oraz metod optymalizowania wydajnoci aplikacji.
Nowe moliwoci PHP5
Podstawy PHP5 i programowania zorientowanego obiektowo
Stosowanie wzorcw projektowych
Techniki tworzenia aplikacji WWW
Komunikacja z bazami danych, wsppraca z MySQL i SQLite
Obsuga bdw i wyjtkw
Przetwarzanie plikw XML
Instalowanie biblioteki PEAR
Pakiety PEAR
Tworzenie komponentw PEAR
Przenoszenie kodu z PHP4 do wersji PHP5
Projektowanie wydajnych aplikacji
Jeli tworzysz aplikacje WWW, pakiety lub rozszerzenia PHP, w tej ksice znajdziesz
odpowiedzi na wszystkie pytania.
Spis treci
Sowo wstpne ............................................................................... 15
Przedmowa ..................................................................................... 17
Rozdzia 1. Co nowego w PHP5? ...................................................................... 25
1.1. Wprowadzenie ..................................................................................................... 25
1.2. Wasnoci jzyka ................................................................................................. 25
1.2.1. Nowy model zorientowany obiektowo ................................................... 25
1.2.2. Nowe mechanizmy zorientowane obiektowo ......................................... 27
1.2.3. Pozostae nowe mechanizmy jzyka ...................................................... 31
1.3. Oglne zmiany w PHP ......................................................................................... 32
1.3.1. XML i usugi sieciowe ........................................................................... 32
1.4. Pozostae nowe mechanizmy PHP5 ..................................................................... 36
1.4.1. Nowy meneder pamici ........................................................................ 36
1.4.2. Wycofana obsuga Windows 95 ............................................................. 36
1.5. Podsumowanie ..................................................................................................... 36
Spis treci
7
4.4.3. Wzorzec fabryki ................................................................................... 117
4.4.4. Wzorzec obserwatora ........................................................................... 120
4.5. Refleksja (ang. reflection) .................................................................................. 122
4.5.1. Wprowadzenie ...................................................................................... 122
4.5.2. Interfejs Reflector ................................................................................. 123
4.5.3. Przykady uycia refleksji .................................................................... 125
4.5.4. Implementowanie wzorca delegata przy uyciu refleksji ..................... 126
4.6. Podsumowanie ................................................................................................... 128
Spis treci
9
9.2.7. Blokowanie .......................................................................................... 292
9.2.8. Zmiana nazwy i usuwanie plikw ........................................................ 293
9.2.9. Pliki tymczasowe ................................................................................. 294
9.3. Wyraenia regularne .......................................................................................... 295
9.3.1. Skadnia ................................................................................................ 295
9.3.2. Funkcje ................................................................................................. 308
9.4. Obsuga dat ........................................................................................................ 315
9.4.1. Odczytywanie daty i godziny ............................................................... 315
9.4.2. Formatowanie daty i godziny ............................................................... 318
9.4.3. Parsowanie dat w rnych formatach ................................................... 326
9.5. Operacje na grafice przy uyciu GD .................................................................. 326
9.5.1. Przypadek 1: formularz odporny na dziaanie robotw ........................ 328
9.5.2. Przypadek 2: wykres supkowy ............................................................ 333
9.5.3. Rozszerzenie Exif ................................................................................. 338
9.6. Wielobajtowe cigi i zestawy znakw ............................................................... 340
9.6.1. Konwersje zestaww znakw ............................................................... 341
9.6.2. Dodatkowe funkcje obsugujce zestawy znakw wielobajtowych ..... 346
9.6.3. Ustawienia midzynarodowe ................................................................ 350
9.7. Podsumowanie ................................................................................................... 353
10
Spis treci
11
12.11. Publikowanie pakietw ...................................................................................... 442
12.12. Proces publikowania pakietw PEAR ............................................................... 442
12.13. Przygotowanie pakietu ...................................................................................... 444
12.13.1. Analiza kodu rdowego .................................................................... 444
12.13.2. Generowanie sum kontrolnych MD5 ................................................... 444
12.13.3. Aktualizacja pliku package.xml ........................................................... 444
12.13.4. Tworzenie archiwum tarball ................................................................ 445
12.14. Przesyanie kodu ................................................................................................ 445
12.14.1. Przesyanie wydania ............................................................................. 445
12.14.2. Koniec .................................................................................................. 446
12.15. Podsumowanie ................................................................................................... 446
12
Spis treci
13
A.18. Operacje matematyczne ...................................................................................... 598
A.19. Obsuga sieci ...................................................................................................... 602
A.20. Liczby ................................................................................................................. 616
A.21. Patnoci ............................................................................................................. 617
A.22. PEAR .................................................................................................................. 619
A.23. PHP .................................................................................................................... 621
A.24. Przetwarzanie danych ......................................................................................... 629
A.25. Obliczenia naukowe ........................................................................................... 629
A.26. Strumienie .......................................................................................................... 630
A.27. Struktury ............................................................................................................. 632
A.28. System ................................................................................................................ 634
A.29. Przetwarzanie tekstu ........................................................................................... 635
A.30. Narzdzia ............................................................................................................ 637
A.31. Serwisy internetowe ........................................................................................... 640
A.32. XML ................................................................................................................... 642
Rozdzia 3.
Jzyk obiektowy
Wzniose myli wymagaj wzniosego jzyka. Arystofanes
3.1. Wprowadzenie
Obsuga programowania obiektowego zostaa wprowadzona w PHP3. Cho nadawaa
si do pracy, bya niezwykle uproszczona. Niewiele zmienio si pod tym wzgldem
wraz z wydaniem wersji PHP4, gdy w nowej wersji gwny nacisk pooono na
zgodno z poprzednimi. To oglne zapotrzebowanie na ulepszon obsug obiektow spowodowao, e w PHP5 ponownie zaprojektowano cay model obiektowy, dodajc znaczn liczb mechanizmw, a take zmieniajc zachowanie podstawowego
obiektu.
Pocztkujcy uytkownicy PHP dziki lekturze tego rozdziau bd mogli zapozna
si z modelem obiektowym. Jednak zawarte tu informacje bd take uyteczne dla
osb zaznajomionych ju z PHP4, poniewa wraz z wprowadzeniem wersji PHP5
ulego zmianie prawie wszystko, co ma zwizek z programowaniem obiektowym.
Dziki lekturze tego rozdziau czytelnik bdzie mg pozna:
podstawy modelu obiektowego,
sposb tworzenia i cykl ycia obiektu oraz metody jego sterowania,
trzy gwne sowa kluczowe ograniczania dostpu (,
i
),
korzyci pynce z uywania dziedzicznoci klas,
wskazwki prowadzce do udanej obsugi wyjtkw.
78
3.2. Obiekty
Programowanie obiektowe rni si od funkcjonalnego gwnie tym, e dane i kod
wystpuj w nim jako jedna cao, znana pod nazw obiektu. Aplikacje obiektowe
zazwyczaj s podzielone na pewn liczb obiektw, ktre ze sob wspdziaaj.
Kady obiekt zwykle reprezentuje jeden wyodrbniony, niezaleny od innych problem, i ma pewn liczb waciwoci i metod. Waciwoci s danymi obiektu, co zasadniczo oznacza zmienne, ktre nale do obiektu. Metody dla osb przywykych
do pracy w rodowiskach funkcjonalnych s funkcjami, ktre obsuguje obiekt, za
funkcjonalno, ktra wedug przeznaczenia ma by dostpna dla innych obiektw
i wykorzystywana do interakcji z nimi, jest nazywana interfejsem obiektu.
Rysunek 3.1 przedstawia klas. Klasa jest czym w rodzaju szablonu dla obiektu
i opisuje metody i waciwoci, ktre bdzie mia obiekt danego typu. W tym przykadzie klasa reprezentuje osob. Dla kadej osoby w aplikacji mona stworzy oddzielny
egzemplarz tej klasy, reprezentujcy informacje o tej osobie. Jeli na przykad dwie
osoby w naszej aplikacji nosz imiona Jan i Julia, mona utworzy dwa oddzielne egzemplarze tej klasy i dla obu wywoa metod , ktra pozwoli zainicjowa zmienn
, zawierajc imi danej osoby. Metody i skadowe, ktrych mog uywa inne
oddziaujce obiekty, tworz kontrakt klasy. W tym przykadzie kontraktami osoby ze
wiatem zewntrznym s dwie metody i , i .
Rysunek 3.1.
Schemat klasy
Person
Przedstawiony tu przykadowy kod PHP definiuje klas, tworzy jej dwa egzemplarze,
definiuje nazw kadego egzemplarza, po czym wywietla nazwy:
79
80
Wynik zwrcony przez ten kod bdzie identyczny z tym z poprzedniego przykadu.
Poniewa konstruktor nie moe zwraca wartoci, najczstsz praktyk zgaszania
bdu ze rodka konstruktora jest rzucenie wyjtku.
3.5. Destruktory
Destruktory to odwrotno konstruktorw. Wywoywane s one w momencie usuwania obiektu (na przykad gdy do danego obiektu nie ma ju referencji). Poniewa
PHP pilnuje, by po kadym daniu wszystkie zasoby zostay zwolnione, destruktory
maj ograniczone znaczenie. Mimo to wci mog by przydatne do wykonywania
okrelonych czynnoci, takich jak oprnianie zasobu lub informacji o rejestracji
w momencie usuwania obiektu. Destruktor moe by wywoany w dwch sytuacjach:
podczas wykonywania skryptu, kiedy niszczone s wszystkie odwoania do obiektu,
lub w momencie osignicia koca skryptu i zakoczenia wykonywania przez PHP
dania. Druga sytuacja jest do niedogodna, poniewa jest si uzalenionym od
pewnych obiektw, ktrych destruktory mogy ju zosta wywoane, wskutek czego
obiekty te nie s ju dostpne. Std te destruktorw naley uywa ostronie i nie
uzalenia ich od innych obiektw.
81
3.6. Odwoywanie si
do metod i waciwoci
przy uyciu zmiennej $this
Podczas wykonywania metody obiektu definiowana jest automatycznie specjalna
zmienna o nazwie , ktra jest odwoaniem do samego obiektu. Uywajc tej zmiennej i notacji mona odwoywa si do metod i waciwoci tego obiektu. Na przykad mona uzyska dostp do waciwoci
przy uyciu instrukcji
(naley zauway, e przed nazw waciwoci nie uywa si znaku ). Metody
obiektu mona udostpni w ten sam sposb: na przykad z wntrza jednej z metod
klasy osoby (
) mona wywoa funkcj , wpisujc instrukcj
.
82
Definiujc skadow klasy w definicji klasy, programista musi przed zadeklarowaniem samej skadowej umieci jedno z tych trzech sw. Osoby zaznajomione z modelem obiektowym PHP3 lub 4 wiedz, e w tamtych wersjach wszystkie skadowe
klasy byy definiowane ze sowem kluczowym
. W PHP5 jego odpowiednikiem
jest sowo kluczowe , cho etykieta
zostaa zachowana w celu zapewnienia
kompatybilnoci ze starszymi wersjami programu. Skadnia ta jest jednak przestarzaa,
dlatego namawiamy do przeksztacenia swych skryptw i dostosowania ich do nowych
wymogw:
!
(&#&+',
$-
(&#%
(
#
$&+',
$-
#
(.
&+',
$-
( -
$
// ...
&
!
dostp do nich jest moliwy tylko z wntrza metody obiektu. Nie s natomiast
dostpne z metod obiektw pochodnych. Poniewa waciwoci prywatne
nie s widoczne z klas pochodnych, dwie pokrewne ze sob klasy mog
deklarowa te same waciwoci prywatne. Kada klasa bdzie widzie
tylko wasn prywatn kopi, ktra nie jest powizana z innymi.
Zazwyczaj w przypadku skadowych, ktre maj by dostpne spoza obiektu, naley
uywa sowa , za dla tych, ktre s wedug logiki obiektu wewntrzne,
sowa
. Z kolei sowa
naley uywa do tych skadowych, ktre
wedug logiki obiektu s wewntrzne, ale tylko wtedy, gdy rozsdne jest ich zignorowanie w klasach pochodnych:
83
Ten przykad niepenego kodu przedstawia typowe uycie kadego z trzech modyfikatorw dostpu. Klasa z naszego przykadu zarzdza poczeniem z baz danych,
wczajc w to kierowane do bazy zapytania:
Uchwyt poczenia z baz danych znajduje si w skadowej
, poniewa
$. Aby to anulowa, programista
z metod klasy obiektu, ale nie z klasy dziedziczcej. Podobnie jak w przypadku
waciwoci, metody
mog by ponownie definiowane przez klasy
dziedziczce. Kada klasa bdzie widzie wasn wersj metody:
/&!#
!
##
#
#
/&!#
84
Ten przykadowy zarys kodu moe by uyty w stosunku do klas pocze z baz danych.
Metoda
jest metod wewntrzn, ale pozwala na dziedziczenie z klasy oraz na jej
zmian, dlatego jest oznaczona sowem
. Metoda "#$
jest cakowicie wewntrzna wzgldem klasy i dlatego take ona oznaczona jest jako
.
W przypadku braku modyfikatora dostpu dla metody domylnie uywana jest
opcja . Z tego powodu w pozostaych rozdziaach sowo kluczowe
bdzie czsto pomijane.
85
!
99 7
%$+
#6
&::
!
99 7
%$+
#6
&
Warto waciwoci
&' pierwszego obiektu rwna si (, za drugiego ).
Jeszcze lepszym przykadem wykorzystania waciwoci statycznej jest wzorzec Singleton, przedstawiony w nastpnym rozdziale.
86
przy uyciu nazwy klasy, za sama metoda statyczna moe wywoa nastpn metod
statyczn
+
przy uyciu notacji %--. Istnieje moliwo wywoania
metody statycznej klasy nadrzdnej przy uyciu notacji
--, co zostanie omwione nieco dalej w tym samym rozdziale.
87
!?!
1?/!%-
@1??A
4*)?&'
(
4
5994*)?
!?!
991?/
&
!?!
&(
4
W PHP4 ten kod zwrciby liczb 1, poniewa do zmiennej ) jest przypisana
warto obiektu (, tworzc w ten sposb kopi i pozostawiajc ( bez zmian.
88
Jednak w PHP5 ( jest uchwytem obiektu (jest numerem identyfikacyjnym), wic
do ) jest kopiowany uchwyt. Podczas zmiany zmiennej ), mona w rzeczywistoci zmieni sam obiekt, do ktrego zmienna ( si odnosi. Wykonanie tego
fragmentu kodu powoduje otrzymanie liczby 2.
Czasami jednak naprawd chodzi o utworzenie kopii obiektu. Jak mona to osign?
Rozwizaniem jest konstrukcja jzykowa
. Ten wbudowany operator tworzy
automatycznie nowy egzemplarz obiektu z jego wasn kopi waciwoci. Wartoci
waciwoci zostaj skopiowane w swej pierwotnej postaci. Dodatkowo mona zdefiniowa metod
, ktra jest wywoywana na nowo utworzonych obiektach
w celu wykonania wszystkich kocowych operacji.
Referencje po skopiowaniu pozostaj referencjami i nie wykonuj penej kopii zawartoci struktury. Oznacza to, e jeli jedna z waciwoci wskazuje przez referencj na inn zmienn (po tym jak zostaa ona przypisana przez referencj), to
po automatycznym klonowaniu, obiekt sklonowany bdzie wskazywa na t sam
zmienn.
89
Cho jest to zaledwie fragment kodu, pozwala zaobserwowa sposb kontroli nad
procesem klonowania. Zmienna %
zostaje tutaj skopiowana z oryginalnego
obiektu, ale jeli ten ma uchwyt otwartego pliku, ktry zosta skopiowany do sklonowanego obiektu, nowa kopia obiektu utworzy wasn kopi uchwytu pliku, tworzc
nowe poczenie z tym plikiem.
3.9. Polimorfizm
Polimorfizm jest prawdopodobnie najwaniejszym zagadnieniem zwizanym z programowaniem obiektowym. Uycie klas i dziedzicznoci uatwia opisanie rzeczywistych sytuacji, czego nie da si powiedzie o zwykym zbiorze funkcji i danych.
Dziedziczno uatwia take rozwj projektw przez ponowne wykorzystanie kodu.
Ponadto, piszc duy i rozszerzalny kod, zazwyczaj zaley nam na jak najmniejszej
liczbie instrukcji sterowania przepywem (takich jak instrukcje %). Odpowiedzi na
te wszystkie potrzeby i na wiele innych jest polimorfizm.
Rozwamy nastpujcy kod:
!
/
-55
(
C1
+$ &
&
#5!
&
&
#5/
&-55
4,D$9%'
%
%, $%
&'
(
C1
+$
!
(
C1
+$
/
W wyniku otrzymamy:
90
91
Wynikiem bd acuchy:
Warto zauway, e tym razem, bez wzgldu na liczb gatunkw zwierzt dodanych
do przykadu, nie trzeba bdzie wprowadza adnych zmian w funkcji
34
5
. Wszystkimi zmianami zajmie si warunek
% 6
oraz wywoanie ,5
.
Ten przykad mona jeszcze poprawia. W PHP dostpne s pewne modyfikatory,
ktre mog zwikszy kontrol nad procesem dziedziczenia. Zostay one omwione
szczegowo w dalszej czci tego rozdziau. Na przykad klas 6
i jej metod
,5
mona oznaczy jako abstrakcyjn przy uyciu modyfikatora
.
Pozwoli to unikn dodawania nic nieznaczcych implementacji definicji metody
,5
w klasie 6
, ale wymusi rwnie jej implementacj we wszystkich klasach dziedziczcych. Dla metody ,5
mona ponadto poda modyfikatory
dostpu. Na przykad modyfikator bdzie oznacza, e metod t mona bdzie
wywoywa z kadego miejsca w kodzie.
PHP nie obsuguje dziedziczenia wielokrotnego, ktre wystpuje w jzyku C++.
Dostarcza za to inne rozwizanie prowadzce do utworzenia wicej ni jednej relacji jest dla danej klasy, wykorzystujce interfejsy podobne do tych z jzyka Java;
zostan one omwione w dalszej czci tego rozdziau.
92
Tych dwch nazw klas warto uywa wszdzie tam, gdzie jest to tylko moliwe.
93
Operator
% sprawdza rwnie, czy obiekt implementuje interfejs (ktry
take jest klasyczn relacj jest). Interfejsy zostay omwione w dalszej czci
rozdziau.
94
mona zdefiniowa dla dowolnej liczby metod w klasie, jednak wystarczy, by cho
jedna metoda z klasy zostaa zadeklarowana jako abstrakcyjna, by jako tak naleao
zadeklarowa ca klas. Ta podwjna definicja pozwala zdefiniowa klas jako
, nawet jeli nie zawiera ona adnych abstrakcyjnych metod, i wymusza, by klasa posiadajca metody abstrakcyjne sama zostaa zadeklarowana jako abstrakcyjna,
co pozwoli na lepsze zrozumienie intencji programisty.
Poprzedni diagram klas mona by przetumaczy na nastpujcy kod PHP:
&
#
+
(
!
HB
H H
&
#
$
-
HB
+0
+
(
$
-
// Tutaj kod rysujcy kwadrat
!#
+
(
$
-
// Tutaj kod rysujcy koo
3.13. Interfejsy
Dziedziczenie klas umoliwia opisywanie relacji rodzic-potomek midzy klasami.
Mona na przykad mie klas bazow ksztatw 5, z ktrej wywodz si klasy
kwadratw 5&
i k $
. Czsto zachodzi jednak konieczno dodania do klas
dodatkowych interfejsw, co zasadniczo oznacza dodatkowe warunki, do ktrych
musi zastosowa si klasa. W jzyku C++ osiga si to przy uyciu dziedziczenia
wielokrotnego i wyprowadzania z dwch klas. W PHP alternatyw dla dziedziczenia
95
96
Interfejsy s domylnie publiczne, dlatego w definicji interfejsu nie mona okrela modyfikatorw metody dla prototypw metod.