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
PHP4.
Kompendium programisty
Autor: Blake Schwendiman
Tumaczenie: Pawe Gonera, Grzegorz Kowalski
ISBN: 83-7197-521-X
Tytu oryginau: PHP 4 Developer's Guide
Format: B5, stron: 840
Korzystajc z tej ksiki, moesz tworzy w PHP4 aplikacje WWW korzystajce z baz
danych. Dowiesz si, jak korzysta z nowych rozszerze sesji, szybszego interpretera
oraz rozszerzonej obsugi jzykw Java i XML powodujcych, e jzyk ten wietnie
nadaje si do tworzenia aplikacji WWW. Niniejsza ksika zawiera wiele praktycznych
przykadw objaniajcych sposoby tworzenia witryn za pomoc szablonw. Podrcznik
ten jest przydatny dla kadego zawodowego programisty, gdy opisuje wszystko od
instalacji i konfiguracji, do wykorzystywania istniejcych fragmentw oprogramowania.
Znajdziesz tu wszelkie informacje potrzebne do:
Poznania nowych funkcji PHP4
Przetwarzania formularzy i kontrolowania poprawnoci danych
Oddzielania HTML-a od kodu PHP4
Uruchamiania i ponownego wykorzystywania kodu
Korzystania z szablonw i baz danych
Generowania statycznych stron HTML na podstawie dynamicznych danych
"
"
"
"
"
"
adna inna ksika nie zawiera tak obszernego opisu programowania w PHP,
uwzgldniajcego najnowsze funkcje, jak ten nieoceniony przewodnik.
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
O Autorze.......................................................................................................................................................... 9
Wstp .................................................................................................................................................................11
Rozdzia 1.
Rozdzia 2.
Jzyk................................................................................................................................................................. 31
Wstp.................................................................................................................................31
Oglne informacje na temat skadni..................................................................................31
Typy ..................................................................................................................................32
Liczby cakowite i zmiennoprzecinkowe...............................................................33
Cigi............................................................................................................................33
Tablice.........................................................................................................................35
Zmienne i stae ..................................................................................................................36
Zmienne predefiniowane ............................................................................................37
Zasig zmiennych .......................................................................................................40
Stae.............................................................................................................................41
Operatory i kolejno ich wystpowania ..........................................................................41
Instrukcje sterujce............................................................................................................42
if, else, elseif ...............................................................................................................43
while............................................................................................................................43
Rozdzia 3.
Rozdzia 4.
Rozdzia 5.
Rozdzia 6.
Spis treci
5
PHPLIB ...........................................................................................................................106
Przechowywanie danych pochodzcych z formularzy....................................................107
Wykorzystanie moliwoci bazy danych ........................................................................110
Podsumowanie ................................................................................................................112
Rozdzia 7.
Rozdzia 8.
Rozdzia 9.
Rozdzia 10.
Rozdzia 11.
Rozdzia 12.
Rozdzia 13.
Rozdzia 15.
Rozdzia 16.
Spis treci
Rozdzia 17.
7
Witryny handlu elektronicznego ....................................................................................................... 297
Wstp...............................................................................................................................297
Bezpieczestwo...............................................................................................................297
Zastosowanie SSL.....................................................................................................298
Certyfikaty ................................................................................................................298
Bezpieczestwo bazy danych ...................................................................................299
Przetwarzanie patnoci...................................................................................................300
Dostarczanie produktw..................................................................................................309
Podsumowanie ................................................................................................................310
Dodatek A
Dodatek B
Dodatek C
Dodatek D
Dodatek E
Uruchamianie aplikacji WWW jest, tak jak w przypadku innych typw aplikacji, procesem
krytycznym. Problemem moe by zdalne uruchamianie programu, szczeglnie jeli nie masz
odpowiednich uprawnie do administrowania serwerem WWW. W tym rozdziale zaprezentowane
s porady i narzdzia, ktre mog usprawni proces uruchamiania aplikacji. Ponadto w niektrych
podrozdziaach przedstawione s zasady inynierii programowania, poniewa mona unikn
wielu problemw przy uruchamianiu aplikacji, jeeli jej projekt jest odpowiednio przygotowany.
Z powodu ogromnego zainteresowania aplikacjami WWW powstao wiele narzdzi (midzy
innymi PHP) do tworzenia takich aplikacji. Niektre spord tych narzdzi zostay stworzone
na podstawie narzdzi ju istniejcych, na przykad ASP i JSP, natomiast inne zostay stworzone
specjalnie dla potrzeb projektowania interaktywnych aplikacji WWW. Wikszo tych narzdzi
nie spenia podstawowych zasad inynierii programowania. By moe wynika to z faktu, e projektowanie aplikacji WWW to zupenie nowa dziedzina informatyki, a pierwszymi projektantami
nowej technologii nie byli dowiadczeni programici. Niezalenie od tych przyczyn, do nowego
rodowiska programowania naley zaadaptowa wszystkie istniejce zasady inynierii programowania. W poniszym podrozdziale zostay przypomniane zasady inynierii programowania. Przestrzeganie tych zasad pozwala unikn wielu bdw w projektowaniu, dziki czemu uruchamianie
aplikacji przebiega sprawniej i szybciej.
166
Jak napisaem w rozdziale 3., Formularze i cookie, mona unikn sprawdzania poprawnoci
niektrych danych w przypadku zastosowania lepszego mechanizmu wprowadzania danych.
Analogicznie, napisanie lepszego (bardziej defensywnego) kodu znacznie skraca czas uruchamiania aplikacji.
Projekt aplikacji WWW musi by dokadnie przemylany, podobnie jak projekt kadej innej aplikacji. Tworzenie sprawnej, efektywnej aplikacji wymaga opracowania waciwego projektu, zachowania zgodnoci ze standardami tworzenia oprogramowania, sprawdzania oprogramowania,
testowania moduw oraz ostatecznego uruchomienia aplikacji. Poszczeglne czynnoci s omwione poniej, w kolejnych sekcjach. Zakadam, e posiadasz ogln wiedz na temat inynierii
programowania.
Projekt aplikacji
Przed rozpoczciem pisania kodu naley okreli wstpne zaoenia aplikacji. W przypadku
realizacji duych projektw takie planowanie moe zaj tygodnie lub miesice. Z kolei wstpne
zaoenia niewielkich projektw mog zosta zapisane na skrawku papieru w cigu kilku minut.
Zawsze naley przeanalizowa wymagania aplikacji, a take opracowa wszelkie alternatywne
sposoby realizacji zada aplikacji przed rozpoczciem pisania kodu. Badania firm TRW i IBM
wskazuj, e wprowadzenie zmian do aplikacji w pocztkowym okresie programowania jest
10 do 200 razy tasze ni wprowadzanie tych samych zmian na kocu caego procesu tworzenia
aplikacji (McConnell, 1993).
W zalenoci od rodzaju projektu, okrelenie wymaganych funkcji aplikacji moe by bardzo pracochonne. Wstpny podzia aplikacji na moduy moe uproci ten proces. W aplikacji WWW moduami takimi mog by: wsppraca z baz danych, autoryzacja uytkownika, obsuga stanu itd.
Po okreleniu zada poszczeglnych moduw naley w razie potrzeby podzieli je na
mniejsze fragmenty i zapisa przeznaczenie kadego fragmentu. W maych aplikacjach dobr
strategi jest podzia moduw na pliki kodu bd klasy obiektowe.
Po zdefiniowaniu zada aplikacji naley opracowa architektur systemu. Trzeba okreli rodzaj
stosowanego systemu zarzdzania relacyjn baz danych (SZRBD) i przeanalizowa wiele innych
elementw struktury, np. organizacj plikw kodu, sposb realizacji ewentualnych zmian itp. Trzeba
take rozway, czy niektre moduy naley zakupi, czy te lepiej napisa je samodzielnie. Mimo
e PHP moe dziaa na wielu serwerach WWW i platformach systemowych, kada z takich
kombinacji posiada indywidualne cechy. Naley powici troch czasu na okrelenie, ktra
platforma sprztowa i serwer WWW bdzie najlepiej odpowiada potrzebom tworzonej aplikacji.
Wstpny budet projektu rzadko jest dobrym powodem wyboru okrelonej platformy. Wybr bazy
danych jest rwnie istotny, jeeli aplikacja ma by dynamiczna. Ponadto naley rozway, czy
serwer WWW i baza danych bd pracoway na tym samym komputerze, czy osobno. W zalenoci od wielkoci i charakteru aplikacji moe by to krytyczne zagadnienie.
167
Po przeanalizowaniu tych wszystkich zagadnie naley okreli organizacj kodu. Zdefiniuj konwencj nazywania plikw i katalogw, co uproci identyfikacj kodu. Wymyl alternatywny
plan na wypadek, gdy istnieje due prawdopodobiestwo zmian. Jeeli przewidujesz wystpowanie zmian, napisz aplikacj, ktra bdzie lokalizowaa zmiany w kilku moduach, a reszt
buforowaa. Jest to szczeglnie istotne wtedy, gdy przy tworzeniu aplikacji korzystasz
z narzdzi pochodzcych z innych rde lub oprogramowania w wersji beta. Tworzenie zastpnikw takiego kodu jest atwe do zaimplementowania i w duszym okresie czasu zapewnia atwiejsze utrzymanie aplikacji.
Na koniec naley zadecydowa, ktre moduy aplikacji zostan stworzone przy pomocy gotowych narzdzi pochodzcych od zewntrznych dostawcw. Dylemat tworzy czy kupi
jest do problematyczny. W zalenoci od harmonogramu projektu, moesz nie mie wystarczajco duo czasu, aby mc dostatecznie przetestowa dostpne narzdzia. Jednak moesz
rwnie nie mie wystarczajco duo czasu na stworzenie ich od podstaw. Aby zmniejszy
wpyw tej decyzji na projekt, mona stworzy wasne funkcje porednie, ukrywajce implementacj gotowych narzdzi.
Waciwe zaprojektowanie aplikacji wymaga czasu. W dobrych systemach faza projektowania
zajmowaa 20 do 30 procent czasu ich tworzenia (McConnell, 1993). Jest to czas przeznaczony na
projektowanie wysokiego poziomu, a przecie projektowanie szczegw implementacji rwnie
zabiera sporo czasu.
Przegld oprogramowania
Przegld oprogramowania umoliwia zrealizowanie kilku celw naraz. Na przykad, przegld
oprogramowania umoliwia porwnanie kodu ze standardami kodowania. Pocztkujcy programici mog korzysta z wiedzy bardziej dowiadczonych kolegw. Przegldy oprogramowania
umoliwiaj take zapewnienie odpowiedniej jakoci oprogramowania. Analizy przegldw oprogramowania stosowanych przy tworzeniu rzeczywistych aplikacji wykazay, e przegldy umoliwiaj wykrywanie bdw ze skutecznoci 55 60%. Ten wynik naley zestawi z jedynie
25-procentow skutecznoci testowania moduw, 35-procentow testowania funkcji oraz
1
Z powodu swobodnego traktowania typw w PHP szczeglnie istotne jest odpowiednie nazywanie
zmiennych. Dobrym pomysem moe by stosowanie tzw. notacji wgierskiej, w ktrej nazwa zmiennej
zaczyna si od liter okrelajcych jej typ, np.: to zmienna przechowujca liczby cakowite,
zawiera cig znakw, a
to zmienna logiczna przyp. tum.
168
Testowanie
Podobnie jak w przypadku innych projektw, testowanie aplikacji WWW powinno obejmowa
rne poziomy aplikacji: testowanie funkcji, testowanie moduw oraz testowanie integracyjne.
Testowanie kadego moduu powinno by odpowiednio zaplanowane. Testy stanowi zbir okrelonych oczekiwa i wymaga.
Testowanie niewielkich projektw moe polega na sprawdzeniu funkcjonowania aplikacji
w kilku przypadkach jej wykorzystania. W przypadku tworzenia wikszych projektw czsto
zatrudniani s specjalici, ktrzy zajmuj si jedynie testowaniem, jednak kady z programistw
powinien by odpowiedzialny za dostarczenie testerom tylu danych, aby ich praca bya efektywna.
Kady twrca kodu powinien rwnie by odpowiedzialny za testowanie swoich moduw na poziomie funkcji lub strony.
Uruchamianie
Uruchamianie jest ostatnim etapem w procesie tworzenia aplikacji, poniewa w momencie,
gdy nastpuje uruchamianie, powinny by ukoczone procesy projektowania, programowania
i cz testowania. Uruchamianie moe by przeprowadzane w kadej fazie testowania jako
cz tego procesu. Wszystkie zmiany wprowadzone do kodu w trakcie procesu uruchamiania
powinny zosta ponownie przetestowane na wszystkich poziomach testowania, poniewa
zmiany te mog by przyczyn powstania nowych bdw.
169
Zanim zaczniesz uruchamia program, powiniene podj czynnoci prowadzce do ograniczenia iloci bdw w kodzie. Taki sposb programowania jest nazywany programowaniem
defensywnym. Polega ono na odpowiednim komentowaniu bdw, a take wewntrznym
sprawdzaniu stanu procedur w trakcie programowania. Kady programista moe komentowa
bdy na swj sposb, jednak komentarze te powinny by zgodne z oglnym standardem. Programici powinni opisywa przeznaczenie funkcji, klasy lub doczanego pliku oraz zawsze
komentowa niejasne fragmenty kodu.
Do sprawdzania stanu funkcji PHP, tak jak wiele jzykw wysokiego poziomu, stosuje funkcj
. Funkcja oblicza warto przekazanego parametru i podejmuje okrelone akcje
w przypadku, gdy jego warto wynosi . W PHP do funkcji mona przekaza
zarwno cig, jak i warto Boolean. Jeeli przekazany zosta cig, jest on wykonywany jako
blok kodu PHP. Opcje asercji w pliku php.ini (
,
,
,
i
) lub opcje przekazane jako parametr wywoania funkcji
definiuj akcj, jak podejmuje funkcja . W tabeli 10.1 wyszczeglnione
s rne opcje asercji.
Tabela 10.1. Opcje asercji i ich opis
Opcja
Domylnie
Opis
170
171
Testowy skrypt wywouje funkcj
cztery razy. Najpierw dwukrotnie przekazywane s waciwe wartoci, a nastpnie dwukrotnie skrypt przekazuje wartoci nieprawidowe.
Wynik dziaania skryptu jest przedstawiony na rysunku 10.1. Poniewa PHP wewntrznie wymusza typy zmiennych, wywoanie
jest realizowane
bez adnych ostrzee (poza generowanymi przez asercje).
jest ustawione na , przestaj dziaa. Aby zmieni t opcj, naley albo wywoa
funkcj !!"#$%$&'" , albo odpowiednio ustawi dyrektyw konfiguracji. Wykorzystujc opcj konfiguracji, mona instalowa aplikacj w rodowisku z wyczonymi asercjami, a pracowa w takim, w ktrym asercje s aktywne.
Istnieje jeszcze jedna funkcja pomagajca w programowaniu defensywnym, .
Funkcja ta jako argumentu wymaga liczby cakowitej okrelajcej poziom raportowania bdw.
Argument ten jest traktowany jako maska bitowa, wic mona poda zestaw kilku ustawie.
PHP posiada zestaw staych uywanych razem z t funkcj. S one wyszczeglnione poniej.
Warto
Nazwa
,,44;4
,<!4==>
,)!4?,
,=;@,
16
,@;4,,44;4
32
,@;4,<!4==>
64
,@;A)B,,44;4
128
,@;A)B,<!4==>
256
,C?,4,44;4
512
,C?,4<!4==>
1024
,C?,4=;@,
172
Istnieje rwnie dodatkowa staa, "((, ktra uaktywnia wszystkie informacje o bdach. W trakcie tworzenia aplikacji poziom raportowania bdw naley ustawi na "((, co spowoduje
wywietlanie wszystkich informacji o bdach w kodzie. Ustawienie to jest rwnie przydatne
w trakcie doczania do aplikacji zewntrznej biblioteki. Przykadowy kod zamieszczony na wydruku 10.3 generuje ostrzeenia w przypadku ustawienia maksymalnego poziomu raportowania
bdw. Przy standardowych ustawieniach skrypt nie wywietla adnego komunikatu.
Wydruk 10.3. Przykad wykorzystania funkcji error_reporting()
-0
10
0)'- DE1F&
0
&
10
10
"!$2
2$021252
2$02A125
2 2$024
G
252
2$02C?2%
&&? 11'- DE1F
2!H
I$23"!H
I3202%
,!BB%
2!H
I$23"!H
I3202%
0
&10
& -0
Wyniki dziaania powyszego skryptu s przedstawione na rysunku 10.2. Jak mona zauway,
ustawienie bardziej restrykcyjnego poziomu raportowania bdw moe zaowocowa wykryciem
bdw w kodzie, ktre mog by rdem wielu problemw w procesie tworzenia aplikacji.
W tym przypadku problem moe wydawa si bahy, ale jeeli zdefiniujemy sta o nazwie
reprezentujc stan dziaania aplikacji, problem nabierze znaczenia. Na wydruku 10.4
przedstawiony jest skrypt z tak wanie sta. Wyniki jego dziaania s widoczne na rysunku 10.3.
Wydruk 10.4. Drugi przykad wykorzystania funkcji error_reporting() oraz staej state
&&? 1'D
1
57%
&&)' D1
J( D
0
-0
10
0)'- DE1F&
0
&
10
10
"!$2
2$021252
2$02A125
2 2$024
G
252
2$02C?2%
&&K-L'-
2!H
I$23"!H
I3202%
,!BB%
2!H
I$23"!H
I3202%
0
&10
& -0
173
174
Nastpn czynnoci realizowan w ramach programowania defensywnego moe by napisanie wasnego mechanizmu rejestrujcego. W dowolnych miejscach aplikacji mona sprawdza
stan niektrych funkcji lub raportowa bdy wewntrzne i kontynuowa prac. PHP udostpnia funkcj , przy pomocy ktrej mona dodawa wasne zapisy do pliku ladu
aplikacji. Prototyp funkcji wyglda nastpujco:
-
5 H5
H5 II
Pierwszy parametr, ,, zawiera zapisywane dane. Drugi z parametrw okrela miejsce,
w ktrym zostanie zapisany komunikat. Lista prawidowych wartoci parametru znajduje
si w tabeli 10.2.
Tabela 10.2. Wartoci parametru typ
Warto
Opis
Parametr -
jest wysyany do systemowego mechanizmu rejestrowania PHP
przy uyciu mechanizmu rejestrowania zapewnianego przez system operacyjny lub pliku
w zalenoci od ustawienia zmiennej konfiguracji
W czasie pisania ksiki typ 2 nie by dostpny. Kod rdowy zawiera komentarz informujcy,
e zdalne uruchamianie nie jest jeszcze dostpne. Inne typy komunikatw dziaaj w sposb
opisany w tabeli. Skrypt zamieszczony na wydruku 10.5 stanowi przykad wykorzystania funkcji
.
Wydruk 10.5. Wykorzystanie funkcji error_log()
-0
10
04
DE1F&
0
&
10
10
&&R
DE1
11'
-
175
Pierwsze wywoanie funkcji zapisuje komunikat bdu w systemowym dzienniku
bdw. W powyszym przykadzie bd ten wysyany jest do dziennika bdw Apache. Drugie
wywoanie skutkuje wysaniem poczty elektronicznej do odbiorcy okrelonego w parametrze .
Informacje zawarte w dodatkowych nagwkach s utworzone na podstawie tych samych zasad,
co w przypadku funkcji , . Ostatnie wywoanie powoduje zapisanie komunikatu bdu do
pliku, w tym przypadku /tmp/error.log.
Wykorzystanie tego mechanizmu nie jest w dosownym znaczeniu uruchamianiem, ale jego
zastosowanie moe znacznie skrci i uatwi waciwe uruchamianie, umoliwiajc wyeliminowanie niektrych bdw i przeocze ju w fazie programowania. Jak wczeniej wspomniaem,
ograniczenie liczby bdw w kodzie powinno by priorytetem dla kadego programisty.
Tak jak niemal kady element PHP, mechanizm obsugi bdw mona dostosowa do wasnych
potrzeb, aby spenia wymagania aplikacji. Funkcja umoliwia skonstruowanie prostego
mechanizmu rejestrowania wasnych bdw wystpujcych w aplikacji, ale nie umoliwia obsugi
bdw generowanych przez PHP. Nie pozwala rwnie na przechwytywanie komunikatw generowanych przez funkcje . Na szczcie w PHP takie przypadki mona obsugiwa w inny
sposb.
Funkcja -) pozwala zarejestrowa funkcj w PHP, ktra bdzie wywoywana
za kadym razem, gdy zostanie wygenerowany komunikat bdu. Funkcja -)
wymaga podania jednego argumentu nazwy funkcji obsugi bdw. Prototyp takiej funkcji
wyglda nastpujco:
,@U
1
5
1
5 '
5
5
176
177
W powyszym skrypcie zostaa zdefiniowana funkcja obsugi bdw ,".) , ktra
wywietla komunikaty bdw w obramowanej tabeli zawierajcej jedn komrk, co pomaga
w odrnieniu komunikatu bdu od reszty kodu HTML. Po zainstalowaniu funkcji obsugi skrypt
powoduje dwa bdy. Pierwszy jest generowany przy uyciu funkcji PHP .
Drugi bd (ostrzeenie) jest identyczny z bdem przedstawionym na wydruku 10.3. Na rysunku
10.4 przedstawiony jest wynik dziaania skryptu.
178
Kod z powyszego wydruku jest podobny do tego z wydruku 10.6. Wywoanie asercji powoduje
wywietlenie jednokomrkowej tabeli. Jeeli nie zostanie zastosowana opcja !!"#$0#1&12,
oprcz informacji zdefiniowanych przez uytkownika wywietlony zostanie standardowy komunikat PHP. Na rysunku 10.5 przedstawiony jest wynik dziaania skryptu z wydruku 10.7.
Mechanizm obsugi bdw w PHP jest bardzo elastyczny. Uatwia to uruchamianie i pniejsze utrzymywanie aplikacji. W nastpnej czci rozdziau poczymy przedstawione dotychczas techniki, co w efekcie uatwi uruchamianie programw w caym cyklu produkcyjnym.
179
180
Pierwsza linia skryptu z wydruku 10.8 powoduje przetworzenie cigu konfiguracji MyDebug,
ktry jest przechowywany w zmiennej rodowiska serwera. Na przykad, plik konfiguracyjny
Apache moe zawiera kod podobny do nastpujcego:
?
,A]K,UC>@;=Z>ZB,$& -&-1
3%
A!B$-1
Y
3
%)$-
3-O98%
Ta opcja konfiguracji jest specyficzna dla moduu MyDebug i nie jest dostpna jako standardowa
cz Apache czy PHP. Jak wida, mona ustawia zmienne rodowiska poprzez pliki konfiguracyjne serwera WWW. Zmienne te s dostpne w kodzie PHP. Zmienna 367"482%*1&2 definiuje
miejsca, w ktrych MyDebug bdzie zapisywa bdy. W tym przypadku modu bdzie zapisywa
bdy do pliku (/tmp/mydebug.log), wysya na adres e-mailowy (mydebug@intechra.net) oraz
do gniazda UDP (myserver.com:5400). Zwykle wybiera si jedn z metod zapisu bdw, ale
modu MyDebug umoliwia stosowanie wielu miejsc zapisu bdw naraz. Funkcja /%+
analizuje cig konfiguracji i ustawia odpowiednie zmienne globalne.
Po przeanalizowaniu cigu konfiguracyjnego sprawdzane s wszystkie pliki uywane do zapisywania danych o bdach. Jeeli modu MyDebug nie moe zapisa danych do pliku, zapisywanie do niego jest wyczane. Nastpnie otwierane s wszystkie potrzebne pliki i gniazda. Gniazdo
jest otwierane z wykorzystaniem UDP, co nie wymaga istnienia procesu nasuchu. Wasno ta
jest uyteczna szczeglnie wtedy, gdy zapisywanie jest aktywne na serwerze produkcyjnym,
ale nie zawsze dostpny jest proces nasuchu.
Nastpnie modu MyDebug rejestruje funkcje obsugi bdw i asercji. Ostatni operacj jest
zarejestrowanie funkcji wywoywanej po zakoczeniu dziaania programu, co umoliwia eleganckie zakoczenie dziaania moduu. Wydruk 10.9 przedstawia kod funkcji koczcej dziaanie
programu.
Wydruk 10.9. Kod funkcji koczcej dziaanie programu
AK
?
1
#
"Z
*1
5"?
*1
5"AK
%
"AK
_A]K,UC>K?)B!]ZB,
#
"Z
*1
%
/
"AK
_A]K,UC>K?)B!])
#
"?
*1
%
/
/
181
Funkcja ta zamyka wymagane pliki oraz gniazdo sieciowe. Funkcj koczc moe zarejestrowa dowolny skrypt. PHP pozwala na rejestrowanie wielu funkcji koczcych, ktre s
wykonywane w czasie koczenia pracy skryptu. Cho ten fakt nie jest odnotowany w dokumentacji, funkcje koczce s wywoywane w tej samej kolejnoci, w jakiej zostay zarejestrowane.
Poniewa kolejno ta nie zostaa udokumentowana, Twoje skrypty nie powinny polega na
kolejnoci wykonywania funkcji koczcych. Jeeli zaley Ci na wykonywaniu ich w odpowiednim porzdku, musisz sam sprawdzi kolejno ich wywoywania. Mona przekaza dodatkowe
argumenty do funkcji -)+. PHP przekae je do funkcji kocowej.
Naley rwnie pamita, e w funkcji kocowej nie mona wysya adnych danych do przegldarki. Po skonfigurowaniu modu MyDebug obsuguje bdy za pomoc funkcji z wydruku 10.10.
Wydruk 10.10. Funkcje obsugi bdw
&&Z
D
'
'
1
A,*1
",=5",? 5"Z
5"B
5"@
G
#
AK
",? 5"Z
5"B
5A]K,UC>,44@!BBU!@\5
",=5"@
G %
/
&&Z
D
1
A!
*1
"Z
=-
5"B
=
-5"!
#
AK
2
"!
125"Z
=-
5
"B
=
-5A]K,UC>!??,4@!BBU!@\%
/
Obie funkcje przekazuj parametry do gwnej funkcji obsugi bdw, ktra moe rwnie
zosta wywoana bezporednio z poziomu skryptu. Gwna funkcja obsugi bdw to przedstawiona na wydruku 10.11 funkcja 37.
Wydruk 10.11. Funkcja MyDebug()
&&Z
AK
DF(
(D
AK
"A
5"Z
5"B
5
"@
$A]K,UC>=,4=!B5",
$5
",@
G $
#
"AK
%
"K
$A]K,UC>K?)B!]ZB,%
"K
$A]K,UC>K?)B!])%
"K
..
#
"K
_"AK
#
"
$Z-
"@
5"K
%
"A
$Z- A"@
5"A
5",
5"K
%
"@
$$A]K,UC>,44@!BBU!@\
#
"@
G $Z- @
G ",@
G 5"K
%
/
182
Funkcja 37 formatuje rne parametry w zalenoci od typu medium zapisu (plik, e-mail
lub TCP/IP). Nastpnie wywouje funkcj 37*(wydruk 10.12), ktra wysya dane do
prawidowego miejsca. Funkcje formatujce z wydruku 10.11 zostan omwione w dalszej czci
rozdziau.
Wydruk 10.12. Funkcja MyDebugOutput()
AK
;
"
5"A
5"Z
5"B
5
"@
G 5"K
#
"Z
*1
5"?
*1
5"AK
,-%
"K
#
A]K,UC>K?)B!]ZB,O
"A$2"
O+"A
+ (D"Z
"B
32%
"@
G X$22
#
"A3$2K
O:#"@
G /:2%
/
#
"A3$2:2%
/
"Z
*1
5"A%
%
A]K,UC>K?)B!],A!BO
"A$2"
O+"A
+ (D"Z
"B
32%
"@
G X$22
#
"A3$2K
O:#"@
G /:2%
/
#
"A3$2:2%
/
-"AK
,-524 AK
25"A52Z-O-1
Y 3-::2%
%
A]K,UC>K?)B!])O
"A$2"
a"A
a"Z
a"B
a"@
G bb2%
"?
*1
5"A%
%
/
/
183
Funkcja 37* wysya dane do waciwych miejsc. Jest ona zaskakujco prosta, jeeli uwzgldnimy efektywno kadej z tych opcji. Kada funkcja formatujca uyta w module
MyDebug posiada mechanizm zamiany wewntrznego numeru bdu na posta tekstow, zrozumia dla uytkownika. Na przykad funkcja ,$, przedstawiona na wydruku 10.13,
formatuje kod typu bdu.
Wydruk 10.13. Funkcja FormatType()
&cZ
-
-
1
5
1'
E1'
L
c&
Z-
"@
5"K
#
"K
#
A]K,UC>K?)B!]ZB,O
A]K,UC>K?)B!],A!BO
"@
#
A]K,UC>=,4=!BO
2=,4=!B2%
%
A]K,UC>,44@!BBU!@\O
2,44;4@!BBU!@\2%
%
A]K,UC>!??,4@!BBU!@\O
2!??,4@!BBU!@\2%
%
/
%
A]K,UC>K?)B!])O
"@
%
%
/
/
Jeeli dane s wysyane poprzez TCP/IP, formatowanie nie jest przeprowadzane. Sam numer typu
jest wysyany do zdalnego komputera. W innym wypadku numer typu jest zamieniany na czytelny
cig. Inne funkcje konwertujce uyte w MyDebug dziaaj podobnie. Jedynie funkcja formatujca
kontekst bdu, ,%9(), jest wyranie odmienna. Funkcja ta jest wywoywana jedynie
wtedy, gdy bd zostanie obsuony przez funkcj zarejestrowan za pomoc -) .
Dane kontekstu udostpniane przez PHP zawieraj wszystkie zmienne bdce w zasigu w momencie wystpienia bdu. Dane te s przesyane w postaci tablicy asocjacyjnej z nazwami zmiennych i ich wartociami. Analiza tych danych wymaga wykorzystania funkcji rekurencyjnej, poniewa w kontekcie mog znajdowa si tablice. Funkcja zamieszczona na wydruku 10.14
analizuje dane kontekstu, przeksztacajc je w posta czyteln dla czowieka.
Wydruk 10.14. Analiza danych kontekstu
&cZ
-
-
1
5
1'
E1'
L
3Z
'
E
(Z- @
G 4c&
Z- @
G ",@
G 5"K
#
184
"? $22%
"K
-$2:2%
Z- @
G 4",@
G 5"? 5"K
-%
"? %
/
Z- @
G 4",@
G 5_"? 5"K
-
#
",@
G "d=-
$0"dd
#
"dd
$$
#
"? 3$2"d=-
$2%
Z- @
G 4"dd
5"? 5252%
"? 3$2"K
-2%
/
#
"? 3$2"d=-
$#"dd
/#"K
-/2%
/
/
/
185
&
10
10
=
1
300
-"5"
#
"!$2252
--
252
-252
2%
2
-25,C?,4,44;4%
/
2$$62%
2UD(1
25,C?,4,44;4%
"!$2
2$021252
2$02A125
2 2$024
G
252
2$02C?2%
200!H
I$23"!H
I3202%
-56%
0
&10
& -0
Jedynym zadaniem powyszego skryptu testowego jest generowanie bdw. Wynik dziaania
funkcji , nie jest nigdzie uywany. Jest ona umieszczona w tym skrypcie po to, aby zilustrowa, w jaki sposb wywoanie funkcji wpywa na dane kontekstu przekazywane przez PHP.
Linie z opisem bdu zamieszczone bezporednio przed wydrukiem 10.15 zostay wygenerowane
przy wywoaniu funkcji ,.
Elastyczno tego moduu dobrze obrazuje aplikacja Windows, ktra realizuje proces nasuchu
portu TCP/IP i wywietla przychodzce dane. Jest to prosta aplikacja Delphi, ktra odczytuje
pakiety UDP przychodzce do portu 5400. Po odczytaniu danych aplikacja formatuje linie i wywietla je. Na rysunku 10.6 przedstawiona zostaa ta aplikacja po odebraniu kilku komunikatw
wygenerowanych przez PHP.
186
W tym rozdziale przedstawione zostay techniki programowania defensywnego, ktrych zastosowanie uatwia pniejsze uruchamianie aplikacji. PHP nie zosta jeszcze wyposaony w program
do uruchamiania skryptw podobny do tych, ktre s dostpne w wielu nowoczesnych jzykach
programowania. Jednak odrobina pomysowoci i wykorzystanie rozszerzalnoci PHP pozwala
stworzy wietne narzdzia suce do uruchamiania aplikacji. W rozdziale opisany zosta jeden
z moduw, ktry zapewnia elastyczn obsug bdw i moe by dowolnie modyfikowany i rozbudowywany.