You are on page 1of 43

IDZ DO

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

Po prostu PHP.
Techniki zaawansowane
Autor: Larry Ullman
Tumaczenie: Radosaw Meryk
ISBN: 83-7197-775-1
Tytu oryginau: PHP Advanced For The World Wide Web.
Visual QuickPro Guide
Format: B5, stron: 492

Jzyk programowania PHP stanowi dla wielu osb przepustk w wiat pisania aplikacji
dziaajcych po stronie serwera WWW. atwo z jak przychodzi nauczenie si tego
jzyka, sprawia, e uywaj go setki tysicy amatorw i profesjonalistw na caym
wiecie.
Po pewnym czasie wiedza wyniesiona z podrcznikw opisujcych podstawy PHP
jzyka przestaje wystarcza. Niniejsza ksika pomoe Ci w wykonaniu kolejnego
kroku: kroku w kierunku pisania zaawansowanych aplikacji. Dziki niej wzbogacisz
swoj wiedz i staniesz si prawdziwym ekspertem programowania w PHP,
poszukiwanym na rynku pracy.

Poznasz tajniki programowania obiektowego.


Nauczysz si korzysta z baz danych.
Dowiesz si, w jaki sposb zabezpiecza stworzone przez siebie aplikacje.
Napiszesz wasny sklep internetowy, korzystajc z sesji i bazy SQL.
Poznasz sposoby uruchamiania programw PHP w oderwaniu od serwera WWW.
Nauczysz si generowa nie tylko strony WWW, ale take grafik i pliki PDF.
Dowiesz si, jak i po co uywa jzyka XML.
Skorzystasz z wielu rozszerze jzyka, ktre uatwiaj rozwizywanie zoonych
problemw.

Pomoe Ci w tym prosty jzyk w jakim napisana jest ksika oraz liczne przykady
kodu, a take osoba autora, dowiadczonego programisty i wykadowcy PHP na
Uniwersytecie Kalifornijskim w Berkeley.

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Spis treci

Spis treci
WSTP

Zaawansowane programowanie w PHP


19
Struktura i dokumentowanie kodu ............................................................ 20
Tablice ...................................................................................................... 28
Stae .......................................................................................................... 37
Funkcje rekurencyjne i zmienne statyczne ............................................... 42
Funkcje a odwoania ................................................................................. 52

Rozdzia 2.

Programowanie obiektowe
59
Definiowanie klas ..................................................................................... 61
Tworzenie obiektu .................................................................................... 64
Tworzenie konstruktorw ......................................................................... 70
Dziedziczenie............................................................................................ 76
Uycie metod klas bez ich egzemplarzy ................................................... 82
Szeregowanie obiektw ............................................................................ 84
Usuwanie obiektw................................................................................... 93

Rozdzia 3.

Bazy danych
97
Projekt bazy danych i normalizacja .......................................................... 99
Tworzenie bazy danych .......................................................................... 108
Generowanie wynikw zapyta .............................................................. 113

Rozdzia 4.

Bezpieczestwo
139
Sprawdzanie poprawnoci danych w formularzach................................ 141
Sprawdzanie danych w formularzu za pomoc skryptw JavaScript ..... 155
Mcrypt..................................................................................................... 164
Uwierzytelnianie HTTP .......................................................................... 175
Bezpieczestwo serwera WWW............................................................. 181

Rozdzia 5.

Projektowanie aplikacji WWW


185
Projekt bazy danych................................................................................ 186
Struktura orodka .................................................................................... 190
PHP a szablony obiektowe...................................................................... 202
5

Spis treci

Rozdzia 1.

Spis treci

Spis treci

Obsuga sesji ........................................................................................... 224


Wykorzystanie sesji bez znacznikw cookie .......................................... 233
Uruchamianie diagnostyczne .................................................................. 243
Rejestrowanie i zgaszanie bdw ......................................................... 244
Rozdzia 6.

E-commerce
247
Tworzenie bazy danych .......................................................................... 249
Administracja.......................................................................................... 255
Wywietlanie towarw online................................................................. 271
Implementacja koszyka na zakupy ......................................................... 279

Rozdzia 7.

PHP w sieci
289
Wykrywanie przegldarki ....................................................................... 290
Dostp do innych orodkw WWW za pomoc PHP............................. 298
Wykorzystanie fsockopen() .................................................................... 303

Rozdzia 8.

PHP a serwer
309
Uruchamianie skryptw za pomoc usugi cron ..................................... 310
Kompresja plikw za pomoc PHP ........................................................ 317
Wykorzystanie moduu COM w PHP..................................................... 322

Rozdzia 9.

XML i PHP
331
Czym jest XML?..................................................................................... 332
Skadnia jzyka XML ............................................................................. 334
Definicje typu dokumentw.................................................................... 337
Analiza dokumentw XML za pomoc PHP oraz Expat........................ 344
Obsuga bdw w XML......................................................................... 351

Rozdzia 10. Generowanie grafiki


355
Tworzenie prostej grafiki ........................................................................ 357
Zastosowanie czcionek TrueType........................................................... 368
Tworzenie wykresw na podstawie danych z bazy danych.................... 376
Zapisywanie i modyfikowanie istniejcych grafik ................................. 387
Rozdzia 11. Tworzenie plikw PDF
395
Tworzenie prostego dokumentu PDF ..................................................... 397
Wprowadzanie tekstu w dokumentach PDF ........................................... 403
Rysowanie figur ...................................................................................... 416
Wykorzystanie ilustracji graficznych...................................................... 424
Tworzenie wielostronicowych dokumentw PDF .................................. 431
6

Spis treci

Rozdzia 12. Rozszerzenia PHP


439
PEAR ...................................................................................................... 440
Zend ........................................................................................................ 447
PHP-GTK................................................................................................ 451
Kod rdowy PHP ................................................................................. 464
Instalacja
465
Instalacja PHP wraz z serwerem Apache w systemie Linux .................. 466
Instalacja PHP z serwerem Xitami w systemie Windows ...................... 472

Dodatek B

Bazy danych
475
Aplikacje systemw zarzdzania bazami danych ................................... 476
SQL......................................................................................................... 477
Informacje dotyczce bazy danych MySQL........................................... 480
Inne zasoby ............................................................................................. 482

Dodatek C

Zasoby oglne
483
Orodki WWW powicone PHP ........................................................... 484
Dodatkowe biblioteki.............................................................................. 486
Bezpieczestwo....................................................................................... 488
Inne zasoby ............................................................................................. 489
Skorowidz

493

Spis treci

Dodatek A

Zaawansowane
programowanie w PHP

Zaawansowane programowanie w PHP

Zaawansowane programowanie w PHP


Na najprostszym poziomie dobre programowanie wyraa si tym, czy
aplikacja lub skrypt dziaa zgodnie z zamiarem. Pocztkujcy programici
pozostan na tym poziomie i nie ma w takim podejciu nic zego.
Jednake zaawansowany programista bdzie prbowa pj nieco
dalej. Bdzie dy do zapewnienia lepszej wydajnoci, niezawodnoci,
bezpieczestwa i przenonoci. Ta ksika nauczy nas, w jaki sposb
rozwin umiejtnoci zaawansowanego programisty PHP.

W rozdziale tym utworzymy kilka skryptw, sucych do utworzenia


i zarzdzania orodkiem totalizatora sportowego online, gdzie uytkownicy
odgaduj zwyciskie zespoy. W kadym tygodniu oraz w caym
sezonie obliczany jest wspczynnik poprawnych typw dla kadego
z uytkownikw. Wymaga to wykonania niewielu czynnoci
administracyjnych. Wybraem ten przykad nie ze wzgldu na to, e
odpowiada tematowi, ale rwnie dlatego, e siga on czasw moich
pocztkw w PHP. Nauczyem si tego jzyka (po przejciu z jzyka
Perl) przy okazji tworzenia podobnej aplikacji. Oczywicie wtedy
zakoczyem prac, kiedy tylko skrypt zacz dziaa. Nie musz
dodawa, e skrypty zaprezentowane w tym rozdziale s bardziej
wydajne, niezawodne, bezpieczne oraz przenone ni te skrypty,
ktre opracowaem wtedy.

19

Zaawansowane programowanie w PHP

Ten rozdzia opisuje niektre nowe funkcje i waciwoci jzyka PHP


w wersji 4., techniki, jakie bd stosowane w tej ksice, oraz kilka
wskazwek i sztuczek rzemiosa. Chocia zapewne ju wiemy, w jaki
sposb korzysta z tablic, to prawdopodobnie jeszcze nie znamy
konstrukcji  lub starszej, ale wci bardzo uytecznej funkcji

 . Prawdopodobnie mielimy ju okazj zapisa wasn
funkcj, ale by moe nie do koca wiemy, w jaki sposb wykorzystywa
rekurencj oraz zmienne statyczne. W rozdziale tym opiszemy te
elementy, a take inne podstawowe informacje, jak: dokumentowanie
kodu, tworzenie jego struktury, stae oraz powizania. Wyjanimy te
rnice pomidzy wykorzystaniem funkcji   a funkcji  ,
a take w jaki sposb tworzy aliasy zmiennych technik, ktra
jest nowa dla jzyka PHP w wersji 4. Ostatecznie w procesie pisania
przykadowych skryptw dowiemy si, e mona tworzy dynamiczne
aplikacje WWW, stosujc baz danych w prostym pliku tekstowym.

Rozdzia 1.

Struktura
i dokumentowanie kodu

Struktura i dokumentowanie kodu

Waciwa struktura kodu oraz jego


dokumentowanie, mimo e nie ma wpywu
na dziaanie aplikacji, stanowi podstaw
zaawansowanego programowania w PHP.
Waciwa struktura oraz dokumentowanie
jest elementem, ktry naley zastosowa
dla wygody wasnej oraz naszych klientw
i wsppracownikw, a take dla programisty,
ktry w przyszoci bdzie by moe zmuszony
poprawia nasz kod.
Kiedy pisz o strukturze kodu, mam na myli
sposb fizycznej organizacji kodu PHP w samym
dokumencie (W rozdziale 5., Projektowanie
aplikacji WWW omwi zagadnienie szersze
struktur witryny). Porwnajmy skrypty 1.1
oraz 1.2. Obydwa s poprawnymi dokumentami
PHP, ale ktry z nich wolelibymy przeglda
i poprawia?
Podstawy budowania struktury kodu odnosz
si do sposobu stosowania wci w kodzie,
pozostawiania pustych wierszy, uywania
nawiasw zwykych i klamrowych itp.
Oglne zasady s nastpujce:
u naley stosowa wcicia blokw kodu

(np. wynikw instrukcji warunkowych


lub zawarto funkcji) o szerokoci jednej
tabulacji lub czterech spacji (w zasadzie
powinno si stosowa spacje, a nie tabulatory,
ale programici stosuj wygodniejsze
tabulacje);
u okrelone fragmenty kodu naley oddziela

pustym wierszem, aby wyrni je wizualnie;


u naley wprowadza spacje pomidzy

sowami, argumentami funkcji, operatorami


itp. (generalnie, cho nie zawsze, w jzyku
PHP liczba spacji nie ma znaczenia);
u funkcje naley umieszcza na pocztku

dokumentu.

20

Skrypt 1.1. Ten skrypt bdzie dziaa prawidowo,


ale znacznie trudniej go poprawia i zrozumie ni
skrypt 1.2

 

 !" "# 

$ %&''''#()$) * 
$$+*   !" "# , , * !. %&''''#(///* 0 1,2 " 1-# "3 #%"45!5" " 1+ 1,67#,89:% %;!<"% ==% %
/,1>" 1?@A'BC
>D < "# '" 1=, ?AE@A5@A>%BF
!  "<A>C
$">?A>BF
>%D !?A>%@"1!3 %G BC
0A>.) C
2H
+>%D !?A>%@AEG BC
6H
9A>.I$%"<5!=II=" 1!= * IC
/">?A>%.J>#%1 ?A>@'BBF
$8='5?A'@I'" 1=, I@A>%BC
$><#!1?A>%BC
$$1< #IK%"! #3'8<"L3<M'7-7-IC
$H1!1F
$01< #N"1#O # '#38P%"5DA>
N1O8D%1' "P!"L@O13"1 ' #QP
7-7-C
$2H
$+>D < "# 1,=%"<5!?A,%@A,BF
$6(#7A%C
$9">?A> .1,,"?A,%BBF
$/">?!D7! ?A> @@+B..%"<5!=BF
A%> .1*%#,1?=@A> BC
">??A%> RS..B ,?A%> R$S.
" 1!BBF
$AD .A%> R$SC
A >.A,A> C
0AD%.>"1?A >BC
2A%RAD S.AD%C
+H
6H
9
1,=%"<5!?A,%@A,BC
/H
0H
0A%.8?BC
0$A,.I$IC

Zaawansowane programowanie w PHP


Skrypt 1.1. cig dalszy

u zapisujmy przeznaczenie zmiennych, chyba

e ich przeznaczenie nie jest oczywiste


nawet dla pocztkujcych programistw;
u opisujmy zastosowanie funkcji;
u wyjaniajmy, jaki jest cel dziaania

fragmentw kodu;
u wymieniajmy pliki, z ktrymi program si

komunikuje, ktrych wymaga itp.;


u oznaczajmy zamykajce nawiasy klamrowe

dla zoonych funkcji oraz struktur sterujcych


(instrukcji warunkowych, ptli itp.).

21

Struktura i dokumentowanie kodu

0A,%.#%1 ,"?A,BC
001,=%"<5!?A,%@A,BC
02<#!1,"?A,%BC
0+
06' "1?"! ?A5@AEB.1< ?A%BBF
09A'!.C
0/A!.C
2' "1?"! ?A5$@AE$B.1< ?AEBBF
2AE$.!D7! ?AE$@@?! 1 ?AE$BBBC
2$">??AE$..A'RA5$SB ,?A5$.BBF
2A'!TTC
20H1!1">?A5$.BF
22A!TTC
2+H
26H
29ARA5S.8?I'!I.-A'!@I!I.-A!BC
2/H
+5!# ?ABC
+>D < "# '" 1=1!D !?AE@A5@A>%BF
+$!  "<A>$C
+">?A>$BF
+0>%D !?A>%@O8 5#' "5G '!G !G BC
+2A>$.) C
++H
+6A,."%#,1?G @AEBC
+9>%D !?A>%@A5G A,G BC
+/
6A>$.I$1!D !=II= * IC
6">?A>%$.J>#%1 ?A>$@'BBF
6$8='5?A@I'" 1=1!D !I@A>%$BC
6><#!1?A>%$BCK5 "L<"1%"5D
601< #IK%"! #'8 "5"7-7-IC
62H1!1F
6+1< #N"1#O D '#38P%"5D
3 8(#, "#'8"'8 "5"@A>$7-7-C
66H
69:6/7#,89 -

Po utworzeniu struktury naszego kodu


powinnimy zapewni, aby by on dobrze
udokumentowany. Dokumentowanie kodu jest
programowym odpowiednikiem umieszczania
notatek na tych, samoprzylepnych
karteczkach. Mona zaryzykowa stwierdzenie,
e dokumentowania pracy nigdy za duo.
Naley opisa dziaanie funkcji, zmiennych,
fragmentw kodu oraz caych stron. W skrypcie
1.3 pokazaem, jak wygldaby skrypt 1.2,
gdyby zawiera komentarze. Oto kilka rad
dotyczcych dokumentowania kodu:

Rozdzia 1.

Struktura i dokumentowanie kodu

Skrypt 1.2. Wstawienie pustych wierszy i tabulatorw


znacznie zwiksza czytelno skryptu

 

 !" "# 

$ %&''''#()$
) * $$+* 
  !" "# , , * !. %&''''#(///* 0 1,2 " 1-# "3 #%"45!5" " 1+ 1,67#,89:% %
/
,1>" 1? U@A'115BC

$>D < "# '" 1=, ?AED1@A518@A>%BF

0!  "<A>"! =" 1C
2
+">?A>"! =" 1BF
6>%D !?A>%@"1!3 %G BC
9A>"! =" 1.) C
/H
$
$>%D !?A>%@AED1G BC
$$H
$
$0A>"1.I$%"<5!=I U
I=" 1!= * IC
$2
$+">?A>%.J>#%1 ?A>"1@'BBF
$6
$98='5?A'" 1!@I'" 1=, I@
A>%BC
$/><#!1?A>%BC

1< #IK%"! #3'8<"L3<M'
7-7-IC
$
H1!1F
01< #N"1#O # '#38P%"5DA>
N1O8D%1' "P!"L@O13"1 
' #QP
7-7-C
2H
+
6>D < "# 1,=%"<5!?A,%@A,"1< #8BF
9
/(#7A%"<5!C
0
0">?A>"1= 1.1,,"?A,%BBF
0$
0">?!D7! ?A>"1= 1@@+B..
%"<5!=BF

22

Skrypt 1.2. cig dalszy


00
02A%!1=>"1= 1.1*%#,1
?=@A>"1= 1BC
0+
06">??A%!1=>"1= 1RS..
 UB ,?A%!1=>"1= 1R$S.
" 1!BBF
09
0/AD!1 1.
A%!1=>"1= 1R$SC
2A 1=>"1.A,"1< #8
A>"1= 1C
2AD!1!=%"<5!.>"1
?A 1=>"1BC
2$A%"<5!RAD!1 1S.
AD!1!=%"<5!C
2H
20H
22
2+1,=%"<5!?A,%@A,"1< #8BC
26H
29H
2/
+A%"<5!.8?BC
+
+$A,"1< #8.I$IC
+A,%.#%1 ,"?A,"1< #8BC
+01,=%"<5!?A,%@A,"1< #8BC
+2<#!1,"?A,%BC
++
+6
+9' "1?"! ?A518@AED1B.1<
?A%"<5!BBF
+/
6A'" !.C
6A#!!1!.C
6$
6' "1?"! ?A518$@AED1$B.1<
?AED1BBF
60
62AED1$.!D7! ?AED1$@@
?! 1 ?AED1$BBBC
6+
66">??AED1$..A'" 1!RA518$SB
 ,?A518$.BBF
69A'" !TTC
6/H1!1">?A518$.BF
9
A#!!1!TTC
9H
9$H
9
90A1!D !RA518S.8?I'" !I.A'" !@I#!!1!I.-A#!!1!BC
92H

Zaawansowane programowanie w PHP


Skrypt 1.2. cig dalszy

:% %;!<"% ==% %


$VVVVVVVVVVVVVVVVVVVVVVVVVVVVV
W"1<"#'8!8! 1 # "3 #
%"45!5"1(#
0
2%<#'4&8 
+
6K%"! #&W"1%"1X$
9
#%'"# #&0!"1% "$
/
U# < &% %J" !"( !<#

$W # %#<1!!='" 1!% %#7!4D(DY1
! # L%"<5='" 1!% %%(1
51Q# !5D 1<3 #QP 8%M'
%#!3<31(M 8< (<38"3%"!DY1 1
" >#<Y1'%"5D 15! #'8

0VVVVVVVVVVVVVVVVVVVVVVVVVVVVV
2:+
 

 !" "# 

6 %&''''#()$) * 
$$+*   !" "# , ,9 * !. %&''''#(///* / 1,$ " 1-# "3 #%"45!5" " 1$ 1,$$7#,8$:% %
$0
$2! '"1 "1! 41Y'115
$+,1>" 1? U@A'115BC
$6
$9VV
$/VK%"!3'8<"L3<M''%"5DV
VV

$>D < "# '" 1=, ?AED1@A518@A>%BF
ZD 5<Y'" 1=, 3%"!DY1 8%8
'%"5D

0!  "<A>"! =" 1C
2
+">?A>"! =" 1BFK%"! "1
%"1'!31(#'"1!3 %8@1 85#
3
6>%D !?A>%@"1!3 %G BC
9A>"! =" 1.) C
/H
0

23

Struktura i dokumentowanie kodu

9+
965!# ?A1!D !BC
99
9/
/>D < "# '" 1=1!D !?AED1@A518@
A>%BF
/
/$!  "<A>"! =" 1$C
/
/0">?A>"! =" 1$BF
/2>%D !?A>%@O8 5#' "5G 8%8
%#%' 1G 8%874L, 1G BC
/+A>"! =" 1$.) C
/6H
/9
//A, ."%#,1?G @AED1BC
>%D !?A>%@A518G A, G BC

$
A>"1$.I$1!D !=I U
I= * IC
0
2">?A>%$.J>#%1 ?A>"1$@'BBF
+
68='5?A1!D !@
I'" 1=1!D !I@A>%$BC
9><#!1?A>%$BCK5 "L<"1%"5D
/1< #IK%"! #'8 "5"7-7-IC

H1!1F
$
1< #N"1#O # '#38P%"5D
3 8(#, "#'8"'8 "5"@
A>"1$7-7-C
0H
2:+7#,86 -

Skrypt 1.3. Ta wersja skryptu 1.2 zostaa waciwie


udokumentowana, ale oczywicie jest miejsce
na dodanie dodatkowych notatek

Rozdzia 1.

Struktura i dokumentowanie kodu

Skrypt 1.3. cig dalszy


0>%D !?A>%@AED1G BC#, "1
3 5D1 D @785O,83%"!3 34
!"L'#!#7 8'"1!3D
0$H
0
00A>"1.I$%"<5!=I U
I=" 1!= * IC!53 "1 3'8
%"5D'>#<"1I%"<5!==" 1!= * I
02
0+">?A>%.J>#%1 ?A>"1@'BBF

31<38  "1%"5D,# 7"<8
06
098='5?A'" 1!@I'" 1=, I@
A>%BC8!4 "1<41Y 7"<8
,#>D 5<Y"'" 1=, 
0/><#!1?A>%BCK5 "L<"1%"5D
2
21< #IK%"! #3'8<"L3<M'7-7-IC
2$
2H1!1F8Q'"1 1 "174L,D'%38%,5D@
(,878# '<"1%"5D784# "1#O"'1
201< #N"1#O # '#38P%"5DA>"1

#!3LD%1' "P!"L@O13"1 '115
' #QP7-7-C
22H
2+
26
29VV
2/V
#7 "1 8%M'(<38V
+VV
+
+$>D < "# 1,=%"<5!?A,%@A,"1< #8BF
38 #QP L'85# DY1>D 5<Y1,=%"<5!
+
+0(#7A%"<5!C
+2
++">?A>"1= 1.1,,"?A,%BBF
W%',31 "15O,1(#%"5D'5 #(D
+6
+9">?!D7! ?A>"1= 1@@+B..
%"<5!=BFU# 8 D<Y@
'%38%,5D#, 13"1 "%"5D
3 8%"
+/
6A%!1=>"1= 1.1*%#,1
?=@A>"1= 1BC

315!3 4<1 "1 3'8%"5D
 #,%#'"1, "># 
6
6$">??A%!1=>"1= 1RS..
 UB ,?A%!1=>"1= 1R$S
." 1!BBF[1O1" #
 "1Y1! %"53, 8"
#3'8<"L3<< @ D1 8(#, "
Y1! '4Q<"'8

24

Skrypt 1.3. cig dalszy


6
60AD!1 1.
A%!1=>"1= 1R$SC
62A 1=>"1.A,"1< #8
A>"1= 1C
6+AD!1!=%"<5!.>"1
?A 1=>"1BC
66A%"<5!RAD!1 1S.
AD!1!=%"<5!C
69H
6/H
9
9
1,=%"<5!?A,%@A,"1< #8BC
U#1Y " 1<Y>D 5<Y"
9$H
9H
90
92A%"<5!.8?BCK" "<Y#' "1
(4M' 1Y3"1 1Y
9+
96A,"1< #8.I$IC
99A,%.#%1 ,"?A,"1< #8BC
9/1,=%"<5!?A,%@A,"1< #8BC
/<#!1,"?A,%BC
/
/$
/VV
/0V7"<31 "1 8(#, "#'8< '8 "5M'V
/2VV
/+
/6' "1?"! ?A518@AED1B.1<
?A%"<5!BBF
L ,'8 "5M'
'(4M' 1Y 7"<8
/9
//A'" !.C! '"1 "1 ' #QP
,5O,1Y 7"<8
A#!!1!.C! '"1 "1 ' #QP
,5O,1Y 7"<8

$' "1?"! ?A518$@AED1$B.1<
?AED1BBF
L ,5O,1Y
 7"<8DO8 5#' "5

0AED1$.!D7! ?AED1$@@
?! 1 ?AED1$BBBC
!D "L<"13 5D1 D 
2
+">??AED1$..A'" 1!RA518$SB
 ,?A518$.BBF[1O1" 8%
DO8 5#' "5Y1! '4Q<"'8@
%383 Y18D%D 5 @1 "1
"<388'"1!3 
6A'" !TTC
9H1!1">?A518$.BF
/A#!!1!TTC

Zaawansowane programowanie w PHP


Skrypt 1.3. cig dalszy

00H1!1F8Q'"1 1 "15#D "5 D


#74L,3"1@Y1O1"# '<"1%"5D
 "1%#'"#,4#!"L
02
0+1< #N"1#O # '#38P%"5D
3 8(#, "#'8"'8 "5"@
A>"1$7-7-C
06H
09:0/7#,82 -

Struktura i dokumentowanie kodu

H
H
$
A1!D !RA518S.8?I'" !I.A'" !@I#!!1!I.-A#!!1!BC
K%"! "1'8 "5M'5O,1(#
3DO8 5#' "5M'' 7"<8
0H
2
+5!# ?A1!D !BC%#3\,5#' "1
 7"<8>71 8<3 "1
6
9
/VV
$VK%"! "1 8(#, "#'8< '8 "5M'V
$VV
$$
$>D < "# '" 1=1!D !?AED1@A518@
A>%BFK%"!DY1'8 "5",#%"5D
$0
$2!  "<A>"! =" 1$C
$+
$6">?A>"! =" 1$BFK%"! "1
%"1'!31(#'"1!3 %8@1 85#
3
$9>%D !?A>%@]<3G %#%' 1G
 74L, 1G BC#, "13 5D
1 D  5@785O,83%"!
3 34!"L'#!#7 8'"1!3D
$/A>"! =" 1$.) C
H

$A, ."%#,1?G @AED1BC
>%D !?A>%@A518G A, G BC
#, "13 5D1 D  5@78
5O,83%"!3 34!"L'#!#7 8
'"1!3D
0H
2
+A>"1$.I$1!D !=I U
I= * IC!53 "1 3'8%"5D
'>#<"1I1!D !== * I
6
9">?A>%$.J>#%1 ?A>"1$@'BBF
 '<"1%"5D,#3%"!D
/
08='5?A1!D !@
I'" 1=1!D !I@A>%$BC8!4 "1
3' #Q<"<41Y 7"<8,#>D 5<Y"
'" 1=1!D !
0><#!1?A>%$BCK5 "L<"1%"5D
0$1< #I8 "5"3%"! #7-7-IC
0

Skrypt 1.3. cig dalszy

25

Rozdzia 1.
Poruszylimy ju sporo zagadnie, dotyczcych
dobrej struktury kodu oraz waciwego jego
dokumentowania. Zwizy dokument powicony
temu tematowi Standard kodowania w PHP
(PHP Coding Standard) mona znale pod
adresem www.DMCinsights.com/phpadv
/coding_standard.php (rysunki 1.1 oraz 1.2).

Struktura i dokumentowanie kodu

W dokumencie tym opisano formalne


reguy zapisywania kodu w PHP wraz z ich
uzasadnieniem. W tej ksice bd wskazywa
miejsca, gdzie przestrzegam konwencji, i te,
gdzie je ami. Naley jednak pamita o trzech
sprawach.
Po pierwsze, chciabym podkreli, e bez
wzgldu na to, czy bdziemy przestrzega
standardu kodowania PHP, czy moich
przyzwyczaje, najwaniejsze jest zachowanie
spjnoci. Niespjno nie tylko jest na bakier
z kadym standardem, ale prowadzi do bdw
i z pewnoci spowoduje konieczno spdzenia
dodatkowych godzin w czasie prb uruchamiania.
Poza tym, jeeli pracujemy w zespole, musimy
opracowa plan, ktrego powinni przestrzega
wszyscy czonkowie zespou. Jeeli
programujemy dla klienta, powinnimy
pozostawi przejrzyst, spjn dokumentacj,
tak aby klient lub inny programista mg
z atwoci zrozumie nasz prac.
Po drugie, struktura kodu i jego dokumentowanie
jest elementem, ktry powinnimy stosowa
od momentu rozpoczcia kodowania
i kontynuowa w czasie pracy. Prby tworzenia
komentarzy po zapisaniu kodu nigdy nie bd
tak skuteczne, a czsto w ogle nie bd podjte.
To, co wydaje si oczywiste w trakcie tworzenia,
stanie si niejasne trzy miesice pniej. Jeeli
jeszcze tego nie dowiadczylimy, to z pewnoci
zdarzy si to nam pewnego dnia.
Po trzecie, ze wzgldu na ograniczenia formatu
ksikowego, skrypty opracowane w tej ksice
od tego momentu nie bd tak dobrze uoone,
ani udokumentowane, jak to by powinno.
Istnieje przecie limit wykorzystania cennej
przestrzeni ksikowej na zapiski typu
  

Osobicie zawsze stosuj si do trzech


wymienionych niej konwencji
(bd to robi take w tej ksice):
26

Rysunek 1.1. PHP Coding Standard


(Standard kodowania w PHP) jest przewodnikiem
gramatycznym programowania w PHP

Rysunek 1.2. PHP Coding Standard (Standard


kodowania w PHP) doskonale opisuje reguy,
uzasadnia je i demonstruje, w jaki sposb
przestrzega tych zasad podczas tworzenia kodu

Zaawansowane programowanie w PHP


u Nazwy zmiennych powinny by zapisywane

maymi literami ze znakiem podkrelenia


jako separatorem sw. Niektrzy zalecaj,
aby nazwy zmiennych globalnych zaczynay
si na liter g, ale ja nie stosuj tej zasady.
u Poniewa w jzyku XML skrcone wersje
znacznikw ( oraz !) s wykorzystywane,

Rysunek 1.3. Program PHPDoc opracowano


w celu zautomatyzowania procesu dokumentowania
kodu. Program wykorzystuje wyraenia regularne
do analizowania kodu i wstawiania opisw

zatem jeeli korzystamy z XML-a,


powinnimy stosowa formalne znaczniki
PHP (  !). Przekonamy si o tym
w rozdziale 9., XML. Zalecam, aby zawsze
stosowa znaczniki formalne, poniewa jest
to najlepszy sposb zachowania zgodnoci
pomidzy serwerami.
u Dla stron, ktre maj by interpretowane

Rysunek 1.4. Jeeli programujemy z wykorzystaniem


biblioteki PEAR, powinnimy przestrzega
specyficznych zasad dokumentowania i tworzenia
struktury kodu (http://pear.php.net/manual/en/
standards.php).

Wskazwki
 Program PHPDoc jest aplikacj typu

open source, wspomagajc prac w PHP.


Opracowano go na podstawie popularnego
programu JavaDoc (sucego
do dokumentowania programw w jzyku
Java). Program ten jest przeznaczony
do wspomagania procesu dokumentowania
kodu. Wicej informacji na temat tego
programu mona znale pod adresem
www.PHPDoc.de (rysunek 1.3).
 Jeeli zamierzamy stworzy kod, ktry

bdzie wykorzystywany wraz z pakietem


PEAR (zobacz rozdzia 12., Rozszerzanie
PHP), wwczas powinnimy przestrzega
regu formatowania obowizujcych dla tego
pakietu (rysunek 1.4).
27

Struktura i dokumentowanie kodu

jako skrypty PHP, zaleca si wykorzystywanie


rozszerzenia .php (dla plikw wczanych,
jak np. klas i stron konfiguracyjnych, mona
wykorzystywa inne rozszerzenia).
Dopuszczalne rozszerzenia plikw s
okrelone przez konfiguracj serwera
WWW, ale w spoecznoci PHP domylnie
przyjmuje si rozszerzenie .php (rozszerzenie
stosowane w PHP w wersji 3. .php3
bdzie dziaa w wikszoci serwerw
z PHP4, ale wydaje si, e ze wzgldu
na istnienie nowych wersji, stosowanie tego
rozszerzenia jest nieuzasadnione).

Rozdzia 1.

Tablice
Tablice s specjalnego rodzaju zmiennymi,
ktre mog dziaa jak tabele w arkuszu
kalkulacyjnym. Ze wzgldu na moliwoci,
jakie oferuj, oraz elastyczno, tablice s
powszechnie wykorzystywane w zaawansowanym
programowaniu w PHP. W tym podrozdziale
opiszemy kilka najbardziej powszechnych
funkcji obsugi tablic.
Nowoci w PHP4 jest konstrukcja ,
ktr opracowano w celu umoliwienia
atwiejszego dostpu do wszystkich indeksw
i wartoci tablicy. Zakadajc, e mamy tablic
o nazwie ", moemy uzyska dostp
do kadego jej elementu za pomoc
nastpujcego kodu:

Tablice

>#1< ?A8!A518.-AED1BF
5#,
H

Osobicie do obsugi tablic wykorzystuj


konstrukcj  i bd to robi take w tej
ksice. Jeeli korzystamy z wczeniejszej
wersji PHP, bdziemy musieli przepisa
powyszy kod na nastpujc posta:
1!1 ?A8BC
' "1?"! ?A518@AED1B.1< ?A8BBF
5#,
H

Podstawow rnic pomidzy konstrukcj


 oraz
  jest fakt, e pierwsza z tych
ptli automatycznie ponownie ustawia tablic
na pozycj pocztkow, natomiast druga tego
nie robi.
Inn funkcj obsugi tablic, ktr czsto
wykorzystuj, chocia nie jest to nowo wersji
PHP4, jest 
 . Funkcja ta pozwala na
podstawienie kadego elementu tablicy
do funkcji zdefiniowanej przez uytkownika.
>D < "# %" =7D!?AED1@A518BF
1< #AED17-G
H
A8.8?
7## 18@ 11 ,!@U
#%D 1@U",^@^ 1!"<BC
8='5?A8@I%" =7D!IBC

28

Zgodnie ze skadni funkcja 


 
pobiera tablic jako pierwszy parametr oraz
nazw funkcji bez adnych nawiasw ani
argumentw jako drugi parametr. W czasie
wykonywania iteracji funkcji 
 
funkcja bdzie otrzymywa kolejne indeksy
tablicy oraz wartoci. Powyszy kod spowoduje
wygenerowanie nastpujcego wyniku:

7## 187 11 ,!7U#%D 17U",^7^ 1!"<7-

Ze skryptw znajdujcych si w dalszej czci


ksiki dowiemy si, w jaki sposb przekaza
wicej argumentw funkcji wywoywanej
za pomoc 
 .
Zwrmy uwag, e funkcja 
 
dziaa jedynie z funkcjami definiowanymi
przez uytkownika i nie bdzie dziaa
z wbudowanymi funkcjami PHP. Naley te
pamita o koniecznoci wykonania funkcji
# w PHP4, jeeli chcemy skorzysta
z tablicy ponownie.
Dla zademonstrowania niektrych
zaawansowanych technik obsugi tablic
zapiszemy pierwsz cz aplikacji obsugujcej
totalizator sportowy. Jej przeznaczeniem
jest obsuga profesjonalnego futbolu
amerykaskiego, ale mona j z atwoci
przystosowa do dowolnej innej dziedziny.
Pierwsze dwa skrypty dynamicznie wygeneruj
formularz, gdzie uytkownicy bd mogli
wprowadza swoje typy. Poniewa nie wszyscy
mamy dostp do bazy danych, aplikacja ta
do zapisu informacji bdzie wykorzystywa
jednorodny plik tekstowy.

Zaawansowane programowanie w PHP


Skrypt 1.4. Dane dla totalizatora bd zapisywane
w plikach tekstowych rozdzielanych tabulatorami
jak plik przedstawiony niej:
]#Q<"1]#!%#,31
$N1'1 !D>>#
N1' ( ," <"  "
0W1 11E1 ,
2%8!
+1 #" ]11 8
65 ,U !!" 8
9#" " 1!# 
/ ," %#"!N [1 !

" !7D( [<5!# E"1
 "<(# "#1
$W #D"!
",1% "
! " ( # W "1(#
0^  W Z <"!<#
2""1 1!!11
+N ]" !1 E1

Aby skorzysta z tablic:


1. Utworzymy plik tekstowy w edytorze

tekstw.
2. Zapiszemy wiersz nagwka (skrypt 1.4):
]#!%#,31]#Q<"1

3. Wpiszemy kolejne gry:


N1'1 !D>>#
N1' ( ," <"  "
W1 11E1 ,
%8!
1 #" ]11 8
5 ,U !!" 8
#" " 1!# 
 ," %#"!N [1 !

" !7D( [<5!# E"1


 "<(# "#1
W #D"!
",1% "
! " ( # W "1(#
^  W Z <"!<#
""1 1!!11
N ]" !1 E1

Gry s wyszczeglnione w formacie Druyna


goci [TAB] Druyna gospodarzy [RETURN]
(bez spacji). Znaku tabulacji uyjemy w celu
rozrnienia dwch elementw kadego
wiersza.
4. Zapiszemy plik jako week1.txt.

29

Tablice

W pliku tekstowym najpierw bdzie


wymieniona druyna goci, a nastpnie
druyna gospodarzy. Kady mecz bdzie
zajmowa oddzielny wiersz. Wiersz
nagwkowy suy do wyznaczenia ukadu
tablicy oraz dziaa jako obejcie niektrych
specyficznych waciwoci tablic. Kiedy ten
plik bdzie wczytany do tablicy, rozpocznie
si ona jak zwykle w przypadku tablic
od indeksu 0. Poniewa wol, aby indeksy
tablic byy zgodne z numerami gier,
a chciabym numerowa wiersze od 1. do 15.
(lub 14., 16. itp.), dlatego opuszczam jeden
wiersz. Tak wic pierwsza gra jest wymieniona
w drugim wierszu, zatem bdzie umieszczona
pod indeksem 1.

Rozdzia 1.
5. Podobne pliki stworzymy dla pozostaych

tygodni w sezonie, nazywajc je na przykad


week2.txt, a do week17.txt. Jeeli ledzimy
ten przykad bez zmian, moemy pobra
wszystkie te pliki z witryny pod adresem
www.DMCinsights.com/phpadv. W plikach
tych nie naley wprowadza adnych
komentarzy, poniewa kolidowaoby to
ze sposobem ich wykorzystania (i tak
bd odczytywane tylko przez PHP).
6. Stworzymy katalog 2001 na naszym serwerze

WWW. Moemy uy dowolnej innej nazwy,


ktra bdzie okrelaa sezon jako cao.

Tablice

7. Uprawnienia do katalogu ustawimy jako 777

(odczyt, zapis, wyszukiwanie dla wszystkich).


Ze wzgldw bezpieczestwa, jeeli
to moliwe, powinnimy umieci ten
katalog poniej katalogu gwnego serwera.
Jeeli ju to zrobimy, powinnimy upewni
si, e stosujemy waciwe odwoania
do tego katalogu we wszystkich
przedstawionych poniej skryptach (tzn.
uywajc odwoania../2001 zamiast 2001/).
8. Umiecimy wszystkie pliki dla

poszczeglnych tygodni w katalogu 2001.


Teraz, kiedy utworzylimy dane zawierajce
informacje o wszystkich grach sezonu, czas
zapisa skrypt, ktry przeksztaci te dane
na format HTML.
9. W edytorze tekstowym stworzymy nowy

dokument HTML (skrypt 1.5):



 

 !" "# 

 %&''''#()$) * 
$$+*   !" "# , , * !. %&''''#(///*  1, " 1-# "3 #%"45!5" " 1 1,-

30

Zaawansowane programowanie w PHP


Skrypt 1.5. Ten skrypt dynamicznie generuje formularz na podstawie pliku w formacie zwykego tekstu

Tablice


 
 !" "# 

$ %&''''#()$) * $$+*   !" "# , , * !. %&''''#(///* 0 1,2 " 1-# "3 #%"45!5" " 1+ 1,67#,89:% %;51<%"=5!<>#% %
/?'115.@
?>"1.A$'115A?'115A * A@!53 "1%"5B %#,! '"1 B1B 8(#, "

$">C?(1!..D>"1C?>"1EEF=38  "1%"5B,# 7"=8

0
#%31=38  "B%"5BG'8H'"1 1 "1>#B3
21= #A>#= "# .! #1<%"=5!% %1 #,.%#! + 717#,1.'", .9I=1!%=" (.0=1%,," (.0"( .=1 16 "( .=1 1J"( . #%9 ,=#!% .'", .I"( .=1 1J"( . #% #'%. #'%%#',K 3'LBM8 5#' "5&
/" %B  8%1. 1*  1.B!1 1!"31.$*1 ( .$- ,$ $A@
$$
$>#1= C?(1!!?518.-?8EFN! #!#' "1 7"=8,#'8H'"1 1 "5M,1O(8
$0
$2">C?518.EF"1!3P#H="1P#!%#,31 "1'8H'"1 8
$+
$6?!1=# ,<8.1*%#,1CQ G?8E@
315!3 4=1 "15M,1(#'"1!3 7"=8
'#,,3"1 R 7"=L
$9?'8.?!1=# ,<8ST@
"1'!38111 #,%#'",31!%#4#'"(#H="
$/? #1.!B7! C?!1=# ,<8STGGC! 1 C?!1=# ,<8STEEE@
B("111 #,%#'",31!%#4#'"(#!%#,38G1B!"8B!B RU3 51 B 

1= # "( .Q=1 1QJ"( .Q #%Q$ ,"( .Q1> QJ"( .Q #%Q #'%.Q #'%Q-" %B  8%1.Q,"#Q
 1.Q%"=5!S?518TQJB1.Q?'8Q-?'8 , ,"( .Q=1 1QJ"( .Q #%Q-%31="' ,0 ,"( .Q"( QJ"( .Q #%Q #'%.Q #'%Q-" %B
 8%1.Q,"#Q 1.Q%"=5!S?518TQJB1.Q? #1Q-? #1 ,2 -Q @
+V
6V
9
/3B%14 "1 "1>#B3" 71"
01= # "( .Q=1 1QJ"( .Q #%Q0 ,=#!% .QQ'", .QIQ"( .Q=1 1QJ"( .Q #%Q-" %B
 8%1.Q!B7" Q 1.Q!B7" QJB1.Q8H"OQ0$ 0 7100" %B  8%1.Q ",,1 Q 1.Q'115QJB1.Q?'115Q02>#-Q @
0+
06V1!1F8H'"1 1 "15#B "5 B#74L,3"1GO1M1"# '="1%"5B "1%#'"#,4#!"L
091= #W"1#M # '#38U%"5B?>"1W1M8B%1' "U!"LG=383"1 '115B! '"# R
' #HU7-7-@
0/V
2:27#,82$ -

31

Rozdzia 1.

Instrukcje echo, print oraz cudzysowy


W PHP istnieje kilka sposobw przesyania tekstu do przegldarki. Najbardziej popularne
sposoby polegaj na wykorzystaniu instrukcji  oraz . Istniej tylko pewne subtelne
rnice w sposobie dziaania tych dwch instrukcji. W jakich sytuacjach naley stosowa
ktr, jest raczej kwesti indywidualnego wyboru ni czegokolwiek innego.
Jedna z rnic polega na tym, e instrukcja echo jest minimalnie, prawie niezauwaalnie
szybsza ni instrukcja print. Wynika to std, e po pomylnym wykonaniu instrukcja print
zwraca warto (1 oznacza, e instrukcja zakoczya si pomylnie), natomiast instrukcja
echo tego nie robi.
Waciwoci funkcji echo, ktrej nie znajdziemy w funkcji print, jest moliwo atwego
umieszczania zmiennych w kodzie HTML. Zazwyczaj (w naszych skryptach) fragment
formularza zapisanego w formacie HTML ma nastpujc posta:
" %D  8%1. 1*  1.D!1 1ED1.:% %1< #AD!1 1C:-

W takim przypadku moemy zastosowa dwa skrty. Po pierwsze, zawsze moemy


pomin ostatni rednik w skrypcie PHP, chocia korzystanie z tego nie jest dobr praktyk.
Poza tym, stosujc instrukcj echo, moemy skrci kod, wpisujc znak rwnoci
po pocztkowym znaczniku PHP (ale tylko w przypadku wykorzystywania krtkiej postaci
znacznika). Tak wic zapis:
:% %1< #AD!1 1C:-

przyjmie posta:

Tablice

:.AD!1 1:-

Waniejsze od tego, z ktrej funkcji skorzystamy (technicznie to nie s funkcje, a konstrukcje


jzyka), jest odpowied na pytanie, czy skorzystamy z apostrofw, czy te z cudzysoww.
W obu instrukcjach echo oraz print mona korzysta zarwno z apostrofw, jak te
z cudzysoww. Rnica polega na sposobie interpretowania zmiennych oraz na tym,
e niektre znaki naley poprzedzi znakiem odwrotnego ukonika. Uycie apostrofu
spowoduje wywietlenie zawartoci w postaci takiej, jak jest i wymaga poprzedzenia
znakiem odwrotnego ukonika jedynie samego znaku apostrofu. Tak wic instrukcja:
1< #I 1>." ,1*% %-#1-IC

zadziaa bez problemu. Odpowiednik tej instrukcji z zastosowaniem cudzysoww przyjby


nastpujc posta:
1< # 1>.G" ,1*% %G-#1-C

Aby w rdle HTML znalaz si znak cudzysowu (co jest konieczne dla zachowania
poprawnoci skadni), naley go poprzedzi znakiem odwrotnego ukonika. Z tego wzgldu
wysyajc kod HTML do przegldarki, stosuj instrukcj echo z apostrofem.
Jednym z problemw podczas wykorzystywania apostrofw jest sposb interpretacji
zmiennych i sekwencji specjalnych, ktre w tym przypadku s traktowane dosownie,
co oznacza, e instrukcje postaci:
A3"1 .I' #!<IC
1< #IA3"1 G IC

spowoduj wywietlenie cigu $zmienna \n, a nie wartoci zmiennej, po ktrej nastpuje
znak koca wiersza, co nastpi w wyniku zastosowania poniszego kodu:
A3"1 .I' #!<IC
1< #A3"1 G C

32

Zaawansowane programowanie w PHP

Instrukcje echo, print oraz cudzysowy (cig dalszy)


Ten sam problem wystpuje w czasie przypisywania wartoci do zmiennej lub przy odwoaniach
do indeksw tablic.
A3"1 .I' #!<IC
1< #A 7"<RIA3"1 ISC, #!"!"L,#111 D%#," ,15!1A3"1 
1< #A 7"<RA3"1 SC, #!"!"L,#111 D%#," ,15!1' #!<

Biorc pod uwag sposb wywietlania zmiennych, powinienem take wyjani sposb
interpretowania w PHP tablic wielowymiarowych. Zazwyczaj element tablicy
wielowymiarowej (tablicy zoonej z tablic) moemy zlokalizowa, stosujc konstrukcj:
A 3'= 7"<8RI 3'= 7='1' ISRI" ,15!= 7='1' IS

Ale prba wywietlenia tego elementu za pomoc instrukcji


1< # #QP'8 #!"A 3'= 7"<8RI 3'= 7='1' ISRI" ,15!= 7='1' ISC

nie zadziaa. W takim przypadku mamy dwie moliwoci. Po pierwsze, moemy uy


operatora konkatenacji, aby opuci cudzysw. Niestety, w niektrych systemach
(np. Mac OS X) taka konstrukcja nie zadziaa:
1< # #QP'8 #!"A 3'= 7"<8RI 3'= 7='1' ISRI" ,15!= 7='1' ISC

Moemy te wykorzysta nawiasy klamrowe wewntrz cudzysoww:


1< # #QP'8 #!"FA 3'= 7"<8RI 3'= 7='1' ISRI" ,15!= 7='1' ISHC

Dotyczy to zarwno instrukcji , jak te instrukcji .

Tablice

Doskonay przewodnik dotyczcy cigw znakw, cudzysoww, apostrofw itp. zagadnie


mona znale pod adresem www.zend.com/zend/tut/using-strings.php.

33

Rozdzia 1.
10. Rozpoczniemy wpisywanie treci

dokumentu HTML oraz umiecimy


inicjujcy znacznik PHP:
7#,8:% %

11. Wskazujemy plik, ktry bdzie

wykorzystywany:
A>"1.I$'115IA'115I * IC

Zakada si, e do skryptu zostanie


przekazana zmienna "
 o wartoci od 1
do 17 (w moim przypadku). Tak wic
wygenerowanie formularza dla kadego
tygodnia wymaga jedynie przekazania
do tego skryptu numeru tego tygodnia.

Rysunek 1.5. Poniewa nie wprowadzilimy


wartoci zmiennej $week (zobacz wiersz adresu),
to skrypt nie mg odczyta pliku. Na rysunku 1.6
pokazano uzyskany wynik, kiedy zastosowano
znak @ w celu wyczenia komunikatu o bdzie
generowanego przez PHP

12. Utworzymy instrukcj warunkow, w ktrej

podejmiemy prb odczytania okrelonego


pliku do tablicy:
">?A(1!.J>"1?A>"1BBF

Tablice

Jeeli skrypt prawidowo odczyta plik,


wwczas zostanie utworzona tablica "$#,
zawierajca informacje o wszystkich grach
danego tygodnia. Dziki zastosowaniu
znaku % spowodujemy, e nie bd
wywietlane komunikaty o bdach
w przypadku, gdy odczytanie pliku
nie powiedzie si (porwnajmy rysunek 1.5,
gdzie nie zastosowano znaku %, z rysunkiem
1.6, gdzie zastosowano ten znak).
13. Rozpoczniemy formularz HTML.
1< #I>#< "# .! #1=%"<5!% %1 #,.
%#!  717#,1.'", .9_<1!%<" (.
0<1%,," (.0"( .<1 1 "( .<1 1E"( . #% ,<#!% .'", ._"( .<1 1
E"( . #% #'%. #'%-%#',`
3'LDO8 5#' "5&
" %D  8%1. 1*  1.D!1 1
!"31.$*1 ( .$- , IC

34

Rysunek 1.6. Zastosowanie znaku @ umoliwia


wyczenie wywietlania mylcych i brzydkich
technicznych komunikatw o bdach

Zaawansowane programowanie w PHP


Formularz HTML jest dosy prosty,
suy do wprowadzania jedynie nazwy
uytkownika oraz typu dla kadej gry.
Pniej mona opracowa system
uwierzytelniania, ktry bdzie dziaa,
zanim uytkownik wykona ten krok
(system ten mgby nastpnie
automatycznie wprowadza lub
zapisywa nazwy uytkownikw).
 Uwaga: Zakoczenie instrukcji echo

koczcym znakiem apostrofu w osobnym


wierszu moe wydawa si dziwne, ale
w rezultacie kod HTML staje si bardziej
czytelny. Dziki niemu mamy pewno,
e nastpna instrukcja HTML rozpocznie si
w osobnym wierszu, a nie od koczcego
!
14. Utworzymy ptl, przegldajc tablic,

wpisujc kad gr do formularza:

 -G C
H
H

Drugi wiersz zapewnia, e obsugiwany


element nie jest pierwszym elementem
w pliku. Jak wynika z przykadu pokazanego
wyej (skrypt 1.4), elementem tablicy pod
indeksem & jest wiersz o wartoci '(
)*+,-'#., ktrego nie bdziemy
wywietla.
Jeeli nie jest to pierwszy element tablicy,
wwczas zostanie on podzielony za pomoc
funkcji /   na poszczeglne czci
(druyn goci oraz druyn gospodarzy).
Kada druyna jest formalnie
przyporzdkowana osobnej zmiennej (za
kadym razem obcinany jest znak RETURN
z nazwy druyny gospodarzy).
Ostatecznie wywietlany jest wiersz tabeli
zoony z uzyskanych informacji.
15. Uzupenimy kod formularza HTML

oraz tabeli.
1< # "( .G<1 1GE"( .G #%G ,<#!% .GG'", .G_G
"( .G<1 1GE"( .G #%G-" %D
8%1.G!D7" G 1.G!D7" G
ED1.G8Q"YG  71" %D  8%1.G ",,1 G 1.G'115G
ED1.GA'115G>#-G C

Naley pamita, aby zastosowa typ 012


w celu przechowania numeru tygodnia, aby
by on dostpny w skrypcie store_picks.php,
ktry obsuguje formularz.

35

Tablice

>#1< ?A(1!!A518.-A8BF
">?A518.BF
A!1<# ,=8.1*%#,1?G @A8BC
A'8.A!1<# ,=8RSC
A #1.!D7! ?A!1<# ,=8RS@@
?! 1 ?A!1<# ,=8RSBBBC
1< # "( .G<1 1G
E"( .G #%G ,"( .G1> GE"( .G #%G
#'%.G #'%G-" %D  8%1.G,"#G
1.G%"<5!RA518SG
ED1.GA'8G-A'8 , ,"( .G<1 1G
E"( .G #%G-%31<"' , ,"( .G"( GE"( .G #%G
#'%.G #'%G-" %D  8%1.G,"#G
1.G%"<5!RA518SG
ED1.GA #1G-A #1 ,-

Pierwszy wiersz w tym kodzie stanowi nowa


konstrukcja , ktrej uycie stanowi
atw i w pewnym sensie szybsz metod
obsugi tablic.

Rozdzia 1.
16. Zakoczymy gwn instrukcj warunkow

i zamkniemy znaczniki PHP i HTML.


H1!1F
1< #N"1#O # '#38P%"5DA>"1
N1O8D%1' "P!"L@<383"1 '115
D! '"# \' #QP7-7-C
H
:7#,8 

Komunikat o bdzie, wygenerowany przez


powyszy kod, jest przeznaczony bardziej
dla programisty ni dla uytkownika
(prawdopodobnie nie bdziemy chcieli
wywietla nazwy pliku w komunikacie
o bdzie, ktry moe by przegldany
przez wszystkich). Komunikat ten mona
przetworzy na bardziej przyjazny
dla uytkownika w zalenoci od sposobu
dziaania naszej aplikacji.

Rysunek 1.7. Oto formularz utworzony przez


skrypt make_picks_form, umoliwiajcy
wytypowanie zwycizcy we wszystkich 15 grach

17. Zapisujemy plik jako make_picks_form.php

Tablice

i kopiujemy ten plik na nasz serwer, do tego


samego katalogu, gdzie utworzylimy
katalog 2001. adujemy go w przegldarce
WWW, dodajc do adresu URL cig

 34, aby skrypt mg dziaa poprawnie


(rysunki 1.7 oraz 1.8). Na razie nie
korzystamy z przycisku Wylij.
Wskazwki
 W rozdziale 5., Projektowanie aplikacji

WWW, zostanie omwione bardziej


szczegowo uycie symbolu %.
 W rozdziale 4., Bezpieczestwo,

opracujemy system rejestracji


uytkownikw oraz uwierzytelniania,
ktrego bdziemy mogli uywa wraz z tymi
skryptami oraz z dowolnymi innymi.

36

Rysunek 1.8. Rozwane wykorzystywanie


instrukcji echo oraz spacji w skryptach PHP
powoduje, e kod rdowy HTML staje si
bardziej czytelny

Zaawansowane programowanie w PHP

Stae
Stae to specjalny rodzaj zmiennych, ktremu
moim skromnym zdaniem nie powica si
dostatecznie duo uwagi. Stae, jak wskazuje nazwa,
zawieraj warto, ktra nie zmienia si, ani te
nie moe si zmienia w czasie dziaania skryptu.
Ponadto dodatkow zalet staych jest fakt,
e w danym zakresie s one globalne, co oznacza,
e s automatycznie dostpne wewntrz funkcji.
W nazwach staych wielko liter ma znaczenie,
podobnie jak w nazwach wszystkich zmiennych
w PHP. Zasad jest zapisywanie nazw staych
tylko wielkimi literami. W czasie nadawania
nazw zmiennym naley stosowa te same zasady,
jak w przypadku zmiennych litera (z wyjtkiem
pocztkowego znaku dolara) lub znak podkrelenia,
po ktrym nastpuj litery, cyfry lub znaki
podkrelenia.
Sta tworzy si za pomoc funkcji  
w nastpujcy sposb:
,1>" 1?N^K^=W^a [&@' #QPBC

W PHP istnieje wiele wbudowanych staych,


wcznie z 505 67 (system operacyjny), 505 897162
(np. 4.0.3pl1), *9 oraz :+7. Dwie zmienne
wbudowane :1 oraz 12
oznaczajce biec nazw pliku oraz numer
wiersza zmieniaj si w czasie dziaania
skryptu. Stae te przydaj si do uruchamiania
diagnostycznego, o czym przekonamy si
w rozdziale 5., Projektowanie aplikacji WWW.
Lubi wykorzystywa stae tam, gdzie wystpuj
zmienne, ktre nie powinny si zmienia, lub
w przypadku, jeeli zmienna ma by dostpna
w caym skrypcie. Jako demonstracj zdefiniowania
i wykorzystania staych zapiszemy skrypt store_
picks.php dla naszego totalizatora online. Skrypt
ten bdzie obsugiwa dane pochodzce ze strony
make_picks_form.php utworzonej poprzednio.
37

Stae

Sta mona zdefiniowa tylko jako liczb


(cakowit lub zmiennoprzecinkow), albo jako
cig znakw. Nie mona zdefiniowa staej jako
tablicy lub jako obiektu, a po utworzeniu staej jej
wartoci nie mona aktualizowa, tak wic
nie mona przeksztaci staej acuchowej
na liczb cakowit. Sta mona uwaa
za niezmienn zmienn.

Rozdzia 1.

Aby wykorzysta stae:


1. W edytorze tekstowym utworzymy nowy

Skrypt 1.6. Skrypt store_picks.php definiuje zmienn


YGGM jako sta, aby zapewni niezmienno jej
wartoci w czasie dziaania skryptu

dokument HTML (skrypt 1.6).



 

 !" "# 

 %&''''#()$) * 
$$+*   !" "# , , * !. %&''''#(///*  1, " 1-# "3 #%"45!5" " 1 1,-

2. Rozpoczniemy wpisywanie treci dokumentu

HTML oraz umiecimy inicjujcy znacznik


PHP:
7#,8:% %

3. Zdefiniujemy sta ;<


,1>" 1? U@A'115BC

Stae

Poniewa na kadej ze stron wykorzystywana


jest warto zmiennej "
 , chcemy
zapewni, eby zmienna ta nie zmieniaa
wartoci w czasie dziaania skryptu. Z tego
powodu zmienn t przeksztacimy na sta.
4. Utworzymy funkcj, zapisujc typy

uytkownikw.
>D < "# '" 1=, ?AED1@A518@A>%BF
>%D !?A>%@AED1G BC
H

Funkcja
   bdzie wykorzystywana
w poczeniu z funkcj 
  zgodnie
z tym, co napisano we wczeniejszej czci
tego rozdziau. Funkcja
  
otrzymuje element tablicy, jej indeks oraz
wskanik do pliku. Zawarto zapisan
do pliku bdzie stanowi nazwa zespou
wybrana przez uytkownika zakoczona
znakiem RETURN. W celu wygenerowania
znaku RETURN naley wykorzysta
sekwencj =, poniewa alternatywna
sekwencja = powoduje problemy
z odczytem pliku w niektrych systemach
(pierwsza sekwencja generuje znak
RETURN, natomiast druga znak CR).

38


 

 !" "#  N
$ %&''''#()$) * 
$$+*   !" "# , , * !. %&''''#(///* 0 1,2 " 1-# "3 #%"45!5" " 1+ 1,67#,89:% %
/1 !58% #7!4D(DY1, 131!58% D
51=%"<5!=>#% %

! '"1 "1 D1D 8(#, "Y5#! 41Y




0ZD 5<Y'" 1=, 3%"!DY1 8%8
'%"5D
2>D < "# '" 1=, ?AED1@A518@A>%BF
+>%D !?A>%@AED1G BC#, "1
3 5D1 D @78D"1Q<"P5O,8
111 '#,,3"1 8'"1!3D
6H
9
 
 !"#$# !%!
& "!'! (#$#
$
$">?A>%.J>#%1 ?A>"1@'BBF
 '<"1%"5D,#3%"!D
$$
$>%D !?A>%@"1!3 %G BC
 '#31 "1'"1!3 %8
$08='5?A%"<5!@I'" 1=, I@
A>%BC8!4 "1<41Y 7"<8
,#>D 5<Y"'" 1=, 
$2><#!1?A>%BCK5 "L<"1%"5D
$+1< #I'#Y1 8%83#! 483%"! 1IC
$6
$9H1!1F8Q'"1 1 "15#D "5 D
#74L,3"1@Y1O1"# '<"1%"5D "1
%#'"#,4#!"L
$/1< #N"1#O # '#38P%"5D
A>"1N1O8D%1' "P!"L@<38
3"1 '115D! '"# \' #QP
7-7-C
H
:$7#,8 -

Zaawansowane programowanie w PHP


5. Wskazujemy plik, ktry bdzie

wykorzystywany
A>"1.I$%"<5!=I UI=I
AD!1 1I= * IC

Nazwa pliku skada si z przedrostka  # ,


po ktrym nastpuje numer tygodnia, znak
podkrelenia, nazwa uytkownika i ponownie
znak podkrelenia. Plik ma rozszerzenie .txt.
Nazwy staej nie mona umieci
w apostrofach ani w cudzysowach,
poniewa w takim przypadku PHP
interpretowaby j dosownie jako ;<,
a nie jako warto, ktr staa reprezentuje.
Jeeli katalog 2001 umiecimy poza
gwnym katalogiem dokumentw WWW,
wwczas w celu waciwego odwoania si
do tego katalogu powinnimy zastosowa
odpowiedni skadni.
6. Prbujemy otworzy plik do zapisu.
">?A>%.J>#%1 ?A>"1@'BBF

7. Zapisujemy dane do pliku.


>%D !?A>%@"1!3 %G BC
8='5?A%"<5!@I'" 1=, I@A>%BC

Pierwszym wierszem, ktry zapisujemy


do pliku, jest wiersz atrapa, a po nim,
wykorzystujc poczenie funkcji 

  ze zdefiniowan uprzednio funkcj

  , zapisujemy pozostae dane.


Teoretycznie moglibymy zdefiniowa
dodatkow funkcj, ktra przed zapisem
danych sprawdzaaby, czy wytypowano
wszystkich zwycizcw.

39

Stae

Jeeli ta instrukcja warunkowa przyjmie


warto  #, wwczas naley sprawdzi,
czy poprawnie ustawilimy uprawnienia
do katalogu 2001 nieprawidowe ich
ustawienie jest najbardziej prawdopodobn
przyczyn bdu, poniewa sam plik do tej
pory nie istnia, zatem powinna istnie
moliwo zapisu do tego pliku. Inn
prawdopodobn przyczyn moe by uycie
zego parametru, na przykad  zamiast
.

Rozdzia 1.
8. Zamykamy plik, a po pomylnym

jego zamkniciu wysyamy komunikat.


><#!1?A>%BCK5 "L<"1%"5D
1< #I'#Y1 8%83#! 483%"! 1IC

9. Koczymy instrukcj warunkow, PHP

oraz HTML.
H1!1F
1< #N"1#O # '#38P%"5DA>"1
N1O8D%1' "P!"L@<383"1 '115
D! '"# \' #QP7-7-C
H
:7#,8 -

Rysunek 1.9. Jeeli skrypt dziaa prawidowo,


wwczas uytkownik uzyska ten lakoniczny
komunikat

10. Zapisujemy plik jako store_picks.php

i kopiujemy go na serwer, do tego samego


katalogu, gdzie zapisalimy skrypt make_
picks_form.php (skrypt 1.5). Uruchamiamy
ten drugi skrypt w przegldarce WWW
(rysunek 1.7) tak, aby skrypt store_picks.php
zosta wykonany (rysunek 1.9).
11. Sprawdzamy w katalogu 2001, czy utworzono

Stae

nowy plik (rysunek 1.10). Moemy pobra


nowo utworzony plik i sprawdzi jego
zawarto (skrypt 1.7).
Rysunek 1.10. Katalog 2001, ktry jest baz danych
plikw tekstowych, zawiera wszystkie dane, wcznie
z nowo utworzonym plikiem picks_1_NAZWA_txt

40

Zaawansowane programowanie w PHP


Skrypt 1.7. Po wykonaniu skryptu make_picks_
form.php oraz store_picks.php zostanie utworzony
poniszy plik, zawierajcy moje typy dla gier
w pierwszym tygodniu
"1!3 %
$D>>#
N1' ( ,
0W1 1
2%8
+]11 8
6U !!" 8
9" 1!# 
/ ," %#"!

" !7D(
 "<(#
$
",1% "
W "1(#
0W Z <"!<#
2""
+1 E1

Wskazwki
 Aby sprawdzi, czy zdefiniowano sta

przed jej uyciem, mona skorzysta


z funkcji  :
">?,1>" 1,?N^K^=W^ [BBF

Naley uwaa, aby nie pomyli funkcji


  z funkcj  , ktra suy
do ustawiania wartoci staej.
 Aby obejrze list wszystkich zdefiniowanych

staych, naley skorzysta z funkcji


$  ## .
 Chocia posiadanie katalogu z prawem

41

Stae

zapisu w obrbie katalogu WWW


(uprawnienia ustawione na 777), tak jak
w powyszym przykadzie katalog 2001,
nie jest bezpieczne, to czasami jest to
konieczno. Istniej obejcia oraz elementy,
na ktre naley zwraca uwag w takich
przypadkach. Zostan one omwione
w rozdziale 4., Bezpieczestwo. Jeeli
istnieje moliwo umieszczenia katalogu
z prawem zapisu poza katalogiem WWW,
tak bdzie lepiej, chocia niektre firmy
wiadczce usugi hostingu nie dadz nam
takiego wyboru.

Rozdzia 1.

Funkcje rekurencyjne
i zmienne statyczne
Programujc, z pewnoci bdziemy mieli
okazj zdefiniowania i zastosowania wasnej
funkcji jest to doskonae narzdzie, ktre
pomaga waciwie zorganizowa nasz kod oraz
zaoszczdzi czas. Elementem, z ktrego by
moe jeszcze nie korzystalimy, jest rekurencja
wewntrz funkcji.

Funkcje rekurencyjne i zmienne statyczne

Rekurencja to waciwo wywoywania funkcji


w obrbie jej samej.
>D < "#  3'=>D 5<Y"?BF
Y5"Q5#,
 3'=>D 5<Y"?BC
H

W wyniku zastosowania rekurencji uzyskamy


efekt, gdzie bdziemy mogli wykorzysta
funkcj zarwno zgodnie z jej przeznaczeniem,
jak te jako ptl.
Stosujc t technik, naley uwzgldni jedn,
ogromnie wan uwag. Naley upewni si,
e funkcja posiada warunek wyjcia. Na przykad
funkcja o kodzie pokazanym poniej bdzie
dziaa w nieskoczono:
>D < "# ,,=# 1?A BF
A TTC
,,=# 1?A BC
H
,,=# 1?BC

Brak warunku okrelajcego zakoczenie


oblicze funkcji tworzy olbrzymi problem
programistyczny ptl nieskoczon.
Porwnajmy funkcj pokazan wyej
do nastpujcej:
>D < "# <#D = #=?A BF
">?A .BF
1< #A 7-7-C
H
H
<#D = #=?BC

42

Funkcja ta bdzie wywoywa sam siebie


dopty, dopki zmienna " nie osignie
wartoci wikszej ni 100. W tym momencie
dziaanie funkcji zakoczy si.
Wykorzystujc rekurencj lub dowolny
skrypt, gdzie ta sama funkcja wykonuje si
wiele razy, warto rozway zastosowanie
instrukcji #. Uycie tej instrukcji
powoduje, e wartoci zmienne s pamitane
pomidzy poszczeglnymi wywoaniami
funkcji bez koniecznoci uycia zmiennych
globalnych. Funkcj >  4&& ,
dla zapewnienia identycznego wyniku jej
dziaania, mona przepisa nastpujco:
>D < "# <#D = #=?BF
!  "<A C
">?A .BF
1< #A 7-7-C
A TTC
<#D = #=?BC
H
H

Jako kolejny krok na drodze do stworzenia


aplikacji totalizatora pikarskiego online
zapiszemy skrypt, ktry wykorzystuje
rekurencj oraz instrukcj #. Skrypt ten
bdzie umoliwia administratorowi
wprowadzenie zwycizcw kadego meczu,
a nastpnie porwnanie zwycizcy z typami
poszczeglnych graczy.

Zaawansowane programowanie w PHP

Aby wykorzysta rekurencj


oraz instrukcj static:
1. W edytorze tekstowym otwieramy skrypt

make_picks_form.php (skrypt 1.5).


Napiszemy skrypt nieco inny od tego,
tak aby mona byo dokona wyboru
zwycizcw.
2. Modyfikujemy wiersze 15. 21.

oryginalnego dokumentu tak, aby


formularz by obsugiwany przez inny
skrypt oraz bez moliwoci wprowadzania
danych przez uytkownikw (skrypt 1.8).

1< #I>#< "# .%#<1!!='" 1!% %


1 #,.%#!  717#,1.'", .9_<1!%<" (.
0<1%,," (.0"( .<1 1IC

Chocia formularz ten bdzie bardzo


podobny do formularza w skrypcie
make_picks_form.php, to jednak bdzie
on obsugiwany inaczej przez skrypt
process_winner.php, ktry zapiszemy
jako nastpny.


 
 !" "# 

$ %&''''#()$) * $$+*   !" "# , , * !. %&''''#(///* 0 1,2 " 1-# "3 #%"45!5" " 1+ 1,67#,89:% %;51=%"<5!=>#% %
/
A>"1.I$'115IA'115I * IC!53 "1%"5D %#,! '"1 D1D 8(#, "

$">?A(1!.>"1?A>"1BBF<38  "1%"5D,# 7"<8

0
#%31<38  "D%"5D@'8Q'"1 1 "1>#D3
)*&+& "!#&
 & *
"#*&
&#
,
-+#!..&  

#*
/0
!1
2
!1
2
!1
#
,
3
9
/>#1< ?A(1!!A518.-A8BFK! #!#' "1 7"<8,#'8Q'"1 1 "5O,1Y(8
$
$">?A518.BF"1!3]#Q<"1]#!%#,31 "1'8Q'"1 8
$$
$A!1<# ,=8.1*%#,1?G @A8BC
315!3 4<1 "15O,1(#'"1!3
 7"<8'#,,3"1 \ 7"<L
$0A'8.A!1<# ,=8RSC
"1'!38111 #,%#'",31!%#4#'"(#Q<"
$2A #1.!D7! ?A!1<# ,=8RS@@?! 1 ?A!1<# ,=8RSBBBC
D("111 #,%#'",31!%#4#'"(#!%#,38@1D!"8D!D \P3 51 D 
$+
3*&
+# !14
# 4
5!14
#&4
,
/+#!14
#4
5!14
#&4
& !4
& !4
,+##(4
!&4

!"4
 6(74
5!4
!!(4
,!!(+#,
+#!14
# 4
5!14
#&4
, %+#,
8+#!14
1*#4
5!14
#&4
& !4
& !4
,+##(4
!&4

!"4
 6(74
5!4
*&"4
,*&"+#,
8+# ,4


43

Funkcje rekurencyjne i zmienne statyczne

Skrypt 1.8. Skrypt pick_winners.php to tylko nieznaczna modyfikacja jego poprzednika skryptu
make_picks_form.php

Rozdzia 1.
3. Modyfikujemy wiersze 31. 35. oryginalnego

skryptu tak, aby wygenerowana tablica miaa


nazw "
#.

Funkcje rekurencyjne i zmienne statyczne

1< # "( .G<1 1GE"( .G #%G ,"( .G1> GE"( .G #%G #'%.G
 #'%G-" %D  8%1.G,"#G 1.G
'" 1!RA518SGED1.GA'8G-A'8 , ,"( .G<1 1GE"( .G #%G
-%31<"' , ,"( .G"( GE"( .G #%G #'%.
G #'%G-" %D  8%1.G,"#G 1.
G'" 1!RA518SGED1.GA #1G
-A #1 , -G C

Ten krok nie jest absolutnie konieczny


poza tym, e skrypt process_winners.php,
obsugujcy ten formularz, powinien
otrzyma bardziej odpowiednie nazwy
zmiennych ("
#, a nie " #).
4. Zapisujemy skrypt jako pick_winners.php.

Zapiszemy teraz skrypt, obsugujcy dane


z formularza pick_winners.php.
5. W edytorze tekstowym utworzymy nowy

dokument HTML (skrypt 1.9).



 

 !" "# 

 %&''''#()$) * 
$$+*   !" "# , , * !. %&''''#(///*  1, " 1-# "3 #%"45!5" " 1 1,-

44

Skrypt 1.8. cig dalszy


$H
H
0
23D%14 "1 "1>#D3" 71"
+1< # "( .G<1 1G
E"( .G #%G6 ,<#!% .GG'", .G_G
"( .G<1 1GE"( .G #%G" %D
 8%1.G!D7" G 1.G!D7" G
ED1.G8Q"YG9 / 710" %D  8%1.G ",,1 G 1.G'115G
ED1.GA'115G0>#-G C
0$
0H1!1F8Q'"1 1 "15#D "5 D
#74L,3"1@Y1O1"# '<"1%"5D
 "1%#'"#,4#!"L
001< #N"1#O # '#38P%"5DA>"1
N1O8D%1' "P!"L@<383"1 '115
D! '"# \' #QP7-7-C
02H
0+:067#,809 -

Zaawansowane programowanie w PHP


Skrypt 1.9. W tym do dugim skrypcie wykorzystano zmienne statyczne oraz rekurencj w celu zapisu
do plikw, odczytywania danych z plikw oraz wykonywania oblicze

45

Funkcje rekurencyjne i zmienne statyczne


 
 !" "# 

$ %&''''#()$) * $$+*   !" "# , , * !. %&''''#(///* 0 1,2 " 1-# "3 #%"45!5" " 1+ 1,67#,89:% %
/
! '"1 "1 D1D 8(#, "Y5#! 41Y
,1>" 1? U@A'115BC
$
VV
0VK%"!3'8<"L3<M''%"5DV
2VV
+
6>D < "# '" 1=, ?AED1@A518@A>%BFZD 5<Y'" 1=, 3%"!DY1 8%8'%"5D
9
#!# #
$
$">?A>"! =" 1BFK%"! "1%"1'!31(#'"1!3 %8@1 85#3
$$>%D !?A>%@"1!3 %G BC
$A>"! =" 1.) C
$0H
$2
$+>%D !?A>%@AED1G BC#, "13 5D1 D @785O,83%"!3 34!"L
'#!#7 8'"1!3D
$6H
$9
$/A>"1.I$%"<5!=I UI=" 1!= * IC!53 "1 3'8%"5D'>#<"1
I%"<5!==" 1!= * I

">?A>%.J>#%1 ?A>"1@'BBF '<"1%"5D,#3%"!D
$
8='5?A'" 1!@I'" 1=, I@A>%BC8!4 "1<41Y 7"<8,#>D 5<Y"
'" 1=, 
0><#!1?A>%BCK5 "L<"1%"5D
2
+1< #IK%"! #3'8<"L3<M'7-7-IC
6
9H1!1F8Q'"1 1 "174L,D@'%38%,5D@(,878# '<"1%"5D784# "1#O"'1
/1< #N"1#O # '#38P%"5DA>"1
#!3LD%1' "P!"L@O13"1 '115' #QP
7-7-C
0H
0
0$
0VV
00V
#7 "1 8%M'(<38V
02VV

Rozdzia 1.
1

Skrypt 1.9. cig dalszy

Funkcje rekurencyjne i zmienne statyczne

0+
06>D < "# 1,=%"<5!?A,%@A,"1< #8BF38 #QP L'85# DY1>D 5<Y1,=%"<5!
09
0/(#7A%"<5!C
2
2">?A>"1= 1.1,,"?A,%BBFW%',31 "15O,1(#%"5D'5 #(D
2$
2">?!D7! ?A>"1= 1@@+B..%"<5!=BFU# 8 D<Y@'%38%,5D#, 13"1 "
%"5D3 8%"
20
22A%!1=>"1= 1.1*%#,1?=@A>"1= 1BC
315!3 4<1 "1 3'8%"5D
 #,%#'"1, "># 
2+
26">??A%!1=>"1= 1RS.. UB ,?A%!1=>"1= 1R$S." 1!BBF
[1O1" # "1Y1! %"53, 8"#3'8<"L3<< @ D1 8(#, "Y1! '4Q<"'8
29
2/AD!1 1.A%!1=>"1= 1R$SC
+A 1=>"1.A,"1< #8A>"1= 1C
+AD!1!=%"<5!.>"1?A 1=>"1BC
+$A%"<5!RAD!1 1S.AD!1!=%"<5!C
+H
+0H
+2
-- !  #& ( &9!# !9!9
+6H
+9H
+/
6A%"<5!.8?BCK" "<Y#' "1(4M' 1Y3"1 1Y
6
6$A,"1< #8.I$IC
6A,%.#%1 ,"?A,"1< #8BC
601,=%"<5!?A,%@A,"1< #8BC
62<#!1,"?A,%BC
6+
66
69VV
6/V7"<31 "1 8(#, "#'8< '8 "5M'V
9VV
9
9$' "1?"! ?A518@AED1B.1< ?A%"<5!BBF
L ,'8 "5M''(4M' 1Y 7"<8
9
90A'" !.C! '"1 "1 ' #QP,5O,1Y 7"<8
92A#!!1!.C! '"1 "1 ' #QP,5O,1Y 7"<8
9+
96' "1?"! ?A518$@AED1$B.1< ?AED1BBF
L ,5O,1Y 7"<8DO8 5#' "5
99
9/AED1$.!D7! ?AED1$@@?! 1 ?AED1$BBBC!D "L<"13 5D1 D 
/
/">??AED1$..A'" 1!RA518$SB ,?A518$.BBF[1O1" 8%DO8 5#' "5Y1!
'4Q<"'8@%383 Y18D%D 5 @1 "1"<388'"1!3 
1

Jeeli uruchamiamy skrypt w systemie Windows, wwczas naley zapisa ten wiersz jakoAED1$.
!D7! ?AED1$@@?! 1 ?AED1$BBB@poniewa znak RETURN skada si w systemie Windows
z dwch znakw (CR+LF) przyp. tum.

46

Zaawansowane programowanie w PHP


Skrypt 1.9. cig dalszy

Funkcje rekurencyjne i zmienne statyczne

/$A'" !TTC
/H1!1">?A518$.BF
/0A#!!1!TTC
/2H
/+H
/6
/9A1!D !RA518S.8?I'" !I.-A'" !@I#!!1!I.-A#!!1!BCK%"! "1'8 "5M'
5O,1(#3DO8 5#' "5M'' 7"<8
//H

5!# ?A1!D !BC%#3\,5#' "1 7"<8>71 8<3 "1
$

0VV
2VK%"! "1 8(#, "#'8< '8 "5M'V
+VV
6
9>D < "# '" 1=1!D !?AED1@A518@A>%BFK%"!DY1'8 "5",#%"5D
/
#!# #

$">?A>"! =" 1$BFK%"! "1%"1'!31(#'"1!3 %8@1 85#3
>%D !?A>%@]<3G %#%' 1G 74L, 1G BC#, "13 5D1 D  5@785O,8
3%"!3 34!"L'#!#7 8'"1!3D
0A>"! =" 1$.) C
2H
+
6A, ."%#,1?G @AED1BC
9>%D !?A>%@A518G A, G BC#, "13 5D1 D  5@785O,83%"!
3 34!"L'#!#7 8'"1!3D
/H
$
$A>"1$.I$1!D !=I UI= * IC!53 "1 3'8%"5D'
>#<"1I1!D !== * I
$$
$">?A>%$.J>#%1 ?A>"1$@'BBF '<"1%"5D,#3%"!D
$0
$28='5?A1!D !@I'" 1=1!D !I@A>%$BC8!4 "13' #Q<"<41Y 7"<8
,#>D 5<Y"'" 1=1!D !
$+><#!1?A>%$BCK5 "L<"1%"5D
$61< #I8 "5"3%"! #7-7-IC
$9
$/H1!1F8Q'"1 1 "15#D "5 D#74L,3"1@Y1O1"# '<"1%"5D "1%#'"#,4#!"L

1< #N"1#O # '#38P%"5D3 8(#, "#'8"'8 "5"@A>"1$7-7-C
$H
:07#,82 -

47

Rozdzia 1.
6. Rozpoczniemy wpisywanie treci dokumentu

HTML oraz umiecimy inicjujcy znacznik


PHP:
7#,8:% %

7. Zdefiniujemy sta WEEK


,1>" 1? U@A'115BC

Poniewa nie chcemy, aby ta warto ulegaa


zmianie oraz ze wzgldu na to, e musi ona
by dostpna dla wielu funkcji, ustawiamy j
jako sta.
8. Stworzymy funkcj zapisujc list

Funkcje rekurencyjne i zmienne statyczne

zwycizcw.
>D < "# '" 1=, ?AED1@A518@A>%BF
!  "<A>"! =" 1C
">?A>"! =" 1BF
>%D !?A>%@"1!3 %G BC
A>"! =" 1.) C
H
>%D !?A>%@AED1G BC
H

Funkcja
   zasadniczo zapisuje
wiersz tekstu do pliku. Poniewa chcemy,
aby pierwszy wiersz pliku by wierszem
atrap, to stworzylimy instrukcj
warunkow, ktra zapisze ten wiersz,
ale tylko wtedy, gdy pierwszy wiersz
nie zosta jeszcze zapisany (nie chcielibymy,
aby wiersz atrapa by zapisywany
za kadym razem, kiedy wywoujemy t
funkcj). Poniewa zmienna "# 
ustawiona na warto *9 po zapisaniu
pierwszego wiersza jest zadeklarowana jako
statyczna za pomoc instrukcji #,
zatem jej warto bdzie pamitana w kadej
iteracji funkcji. Z tego powodu, kiedy funkcja
zostanie wywoana po raz drugi, zmienna
"#  bdzie pamitana jako *9
i instrukcja warunkowa nie wykona si.
9. Wybieramy plik do przetwarzania.
A>"1.I$%"<5!=I U
I=" 1!= * IC

48

Lista zwyciskich zespow dla kadego


tygodnia bdzie zapisywana w pliku pick_
1_Winners_.txt (jeeli jest to tydzie nr 1).
Pliki bd umieszczone w katalogu 2001.
10. Zapiszemy instrukcj warunkow, ktra

otwiera plik i zapisuje w nim tablic


zwycizcw.
">?A>%.J>#%1 ?A>"1@'BBF
8='5?A'" 1!@I'" 1=, I@A>%BC
><#!1?A>%BCK5 "L<"1%"5D
1< #IK%"! #3'8<"L3<M'7-7-IC
H1!1F
1< #N"1#O # '#38P%"5DA>"1

#!3LD%1' "P!"L@O13"1 '115


' #QP7-7-C
H

Kod ten jest bardzo podobny do


zapisanego w skrypcie store_picks.php.
11. Utworzymy funkcj, ktra pobiera

wszystkie istniejce typy uytkownikw.


>D < "# 1,=%"<5!?A,%@A,"1< #8BF
(#7A%"<5!C
">?A>"1= 1.1,,"?A,%BBF
W%',31 "15O,1(#%"5D'5 #(D
">?!D7! ?A>"1= 1@@+B..%"<5!=BF
A%!1=>"1= 1.1*%#,1?=@
A>"1= 1BC
">??A%!1=>"1= 1RS.. UB ,
?A%!1=>"1= 1R$S." 1!BB
AD!1 1.A%!1=>"1= 1R$SC
A 1=>"1.A,"1< #8A>"1= 1C
AD!1!=%"<5!.>"1?A 1=>"1BC
A%"<5!RAD!1 1S.AD!1!=%"<5!C
H
H
1,=%"<5!?A,%@A,"1< #8BC
H

Zaawansowane programowanie w PHP


Funkcja ta wykonuje si w ptli (dziki
przedostatniemu wierszowi powodujcemu
rekurencj) dla wszystkich plikw
w katalogu, a do odczytania wszystkich
typw. Wtedy to warunek instrukcji
warunkowej przyjmie warto  #
i funkcja nie wywoa samej siebie.
W przypadku, kiedy plik spenia kryteria
pliku zawierajcego typy uytkownika
(tzn. #># "  ?&?@3A # A,
wwczas dane zostan odczytane
i zapisane do globalnej tablicy " #
z wykorzystaniem nazwy uytkownika
jako indeksu.
i otworzymy katalog, a nastpnie
wywoamy funkcj   # 
A%"<5!.8?BC
A,"1< #8.I$IC
A,%.#%1 ,"?A,"1< #8BC
1,=%"<5!?A,%@A,"1< #8BC
<#!1,"?A,%BC

13. Zapiszemy ptl, w ktrej sprawdzimy

trafno typw poszczeglnych graczy.


' "1?"! ?A518@AED1B.1<
?A%"<5!BBF
A'" !.C
A#!!1!.C
' "1?"! ?A518$@AED1$B.1<
?AED1BBF
AED1$.!D7! ?AED1$@@
?! 1 ?AED1$BBBC
">??AED1$..A'" 1!RA518$SB ,
?A518$.BBF
A'" !TTC
H1!1">?A518$.BF
A#!!1!TTC
H
H
A1!D !RA518S.8?I'" !I.-A'" !@
I#!!1!I.-A#!!1!BC
H

14. Uporzdkujemy alfabetycznie wyniki

wedug nazwy uytkownika.


5!# ?A1!D !BC

Tablica "#> # w naszym przykadzie


skada si teraz z czterech elementw pod
indeksami Brian, Juan, Larry oraz Michael
(moi czterej uytkownicy testowi). Kady
element wskazuje na inn tablic, ktrej
indeksy to
# oraz ###. Funkcja # 
posortuje pierwszy zestaw indeksw
nazwy uytkownikw w porzdku
alfabetycznym. Sortowanie nie bdzie
miao wpywu na pozostae dane.
15. Utworzymy funkcj, ktra zapisze wyniki

dla okrelonego tygodnia.


>D < "# '" 1=1!D !?AED1@A518@A>%BF
!  "<A>"! =" 1$C
">?A>"! =" 1$BF
>%D !?A>%@]<3G %#%' 1G 74L, 1G BC
A>"! =" 1$.) C
H
A, ."%#,1?G @AED1BC
>%D !?A>%@A518G A, G BC
H

Funkcja ta przypomina funkcj


  ,
z t rnic, e wykorzystuje inny nagwek.
Ponownie wykorzystujemy zmienn statyczn,
aby nagwek by zapisywany tylko raz.

49

Funkcje rekurencyjne i zmienne statyczne

12. Utworzymy gwn tablic, rozpoznamy

Mamy tu dwie ptle, pierwsza dziaa


dla wielowymiarowej tablicy " #,
skadajcej si z wynikw wytypowanych
przez uytkownikw w danym tygodniu.
Kolejna ptla dziaa w tablicy typw kadego
z graczy i sprawdza, czy gracz prawidowo
wytypowa zwycizc. Jeeli tak si stao,
zmienna "
# jest zwikszana o 1, jeeli
nie zwikszana jest zmienna " ###.
Ostatecznie zapisy s wprowadzane
do wielowymiarowej tablicy "#> #,
zawierajcej liczb trafnych i bdnych
typw poszczeglnych graczy.

Rozdzia 1.
16. Wskazujemy plik wynikw i tworzymy

instrukcj warunkow, ktra spowoduje


wysanie danych do tego pliku.
A>"1$.I$1!D !=I UI= * IC
">?A>%$.J>#%1 ?A>"1$@'BBF
8='5?A1!D !@I'" 1=1!D !I@
A>%$BC
><#!1?A>%$BC
1< #I8 "5"3%"! #7-7-IC
H1!1F
1< #N"1#O # '#38P%"5D3
8(#, "#'8"'8 "5"@A>"1$7-7-C
H

Funkcje rekurencyjne i zmienne statyczne

Jest to kolejna kopia kodu wywoujcego


funkcj
  , ktry wykorzystalimy
we wczeniejszej czci skryptu. Kiedy
funkcja 
  wyle tablic "
do funkcji
 #> # , wwczas
wszystkie poprawnie i bdnie wytypowane
wyniki zostan zapisane w pliku o nazwie
results_1_.txt (dla tygodnia numer 1).

Rysunek 1.11. Strona pick_winners.php wyglda


podobnie do strony make_picks_form.php
(rysunek 1.7) z t rnic, e nie ma tu moliwoci
wprowadzenia nazwy uytkownika

Rysunek 1.12. Jeeli skrypt process_winners.php


wykona si poprawnie, zobaczymy te dwa komunikaty.
Wynik dziaania skryptu moemy sprawdzi,
zagldajc do katalogu 2001 (rysunek 1.13)

50

Zaawansowane programowanie w PHP


17. Koczymy kod PHP oraz HTML
:7#,8 -

18. Zapisujemy plik jako process_winners.php,

kopiujemy go do tego samego katalogu,


co skrypt pick_winners.php (skrypt 1.8),
a nastpnie uruchamiamy ten drugi skrypt
w przegldarce WWW (rysunki 1.11
oraz 1.12).
19. Moemy te obejrze zawarto katalogu

2001 (rysunek 1.13), a take zawarto pliku


results_1_.txt (skrypt 1.10).

Funkcje rekurencyjne i zmienne statyczne

Rysunek 1.13. Katalog zawiera teraz plik pick_


Winners_txt, ktry zawiera zwyciskie druyny,
a take plik results_1_.txt, w ktrym znajduj si
informacje o trafnoci typw poszczeglnych graczy

Skrypt 1.10. Skrypt process_winners.php generuje taki


oto plik z wynikami dla kadego tygodnia, dla ktrego
uruchomimy skrypt pick_winners.php. Plik z wynikami
zawiera nazwy wszystkich uytkownikw oraz liczby
trafnych i bdnych typw dla kadego z nich
]<3
$" 
[D 
08
2"< 1

%#%' 1 74L, 1
9 6
0
2
0

51

Rozdzia 1.

Funkcje a odwoania
Domylnie funkcje otrzymuj argumenty
wedug zasady wywoanie przez warto.
Oznacza to, e funkcja otrzymuje warto
zmiennej, a nie sam zmienn. Aby uaktualni
warto zmiennej wewntrz funkcji, naley
zastosowa instrukcj $  albo przekaza
zmienn przez odwoanie.
Oto przykad zwyczajnego dziaania funkcji:

Funkcje a odwoania

>D < "# <  (1=ED1?AE"71BF


AE"71TTC
1< #AE"71C
H
AE"71.C
<  (1=ED1?AE"71BC

Instrukcja echo wywietli warto B, ale warto


zmiennej "  w dalszym cigu wynosi 4
(pamitajmy, e zmienna "  wewntrz
funkcji, oprcz wsplnej nazwy, nie jest tym
samym, czym poza ni). Jeeli bymy jednak
przekazali zmienn "  przez odwoanie,
wwczas warto zmiennej "  poza
funkcj take si zmieni.
Aby przekaza zmienn przez odwoanie, a nie
przez warto, nazw zmiennej naley poprzedzi
znakiem C. Moemy to zrobi w wierszu,
w ktrym wywoujemy funkcj w takim
przypadku dotyczy to bdzie okrelonej

52

zmiennej lub w definicji funkcji, wwczas


bdzie to dotyczy kadej zmiennej
przekazywanej do funkcji.
>D < "# <  (1=ED1?AE"71BF
AE"71TTC
1< #AE"71C
H
AE"71.C
<  (1=ED1?bAE"71BC

Teraz funkcja wywietla warto B. Ten sam


wynik mona osign za pomoc
nastpujcej funkcji:
>D < "# <  (1=ED1?bAE"71BF
AE"71TTC
1< #AE"71C
H
AE"71.C
<  (1=ED1?AE"71BC

Rnica w tym drugim przykadzie polega


na tym, e kada zmienna wysana do funkcji
$  >  automatycznie przekazywana
jest przez adres.
Zalet wykorzystywania przekazywania
zmiennych przez adres jest fakt, e w takim
przypadku zaoszczdza nam to kopotw
zwizanych z zastosowaniem zmiennych
globalnych oraz zwracaniem wartoci przez
funkcje. Przekonamy si o tym, kiedy
utworzymy ostatni skrypt w naszej aplikacji
totalizatora online.

Zaawansowane programowanie w PHP

Aliasy
Nowoci w PHP4 jest moliwo przekazywania parametrw przez adres niezalenie
od funkcji. Skadnia instrukcji sucych do wykonywania tego typu czynnoci jest nastpujca:
AE"71. "<(#D7!C
AE"71$.AE"71C3"1 AE"71$Y1! 5#%"\3"1 1YAE"71
AE"71.bAE"71C3"1 AE"71Y1! #,'#4 "1,#3"1 1YAE"71
AE"71$.N "# 1(D11,1!C' #QP3"1 1YAE"71$ #N "# 1(D1
1,1!' #QP3"1 1YAE"71 #',!38<"\(D "<(#D7!
AE"71.@N "# 1(D11,1!C#7"13"1 1AE"71#3AE"71Y\
' #QP "<(#D7!@N "# 1(D11,1!

Funkcje a odwoania

Wykorzystujc tego typu odwoania, tworzymy alias. W powyszym przykadzie zmienna


" D jest aliasem zmiennej " 4 (wiersz, za pomoc ktrego utworzylimy
ten alias, moglibymy take zapisa jako " D3C" 4E). Dowolne zmiany,
dotyczce jednej ze zmiennych, bd automatycznie uwzgldnione dla drugiej.
Zastosowanie odwoa do zmiennych zamiast kopii moe wpyn na popraw wydajnoci
aplikacji, szczeglnie gdy mamy do czynienia z tablicami duych rozmiarw oraz obiektami.
Podczas gdy kada kopia zmiennej zajmuje tyle samo miejsca w pamici co orygina, to alias
zajmuje go znacznie mniej.
Dobr analogi do tej sytuacji jest skrt do dokumentu w naszym komputerze. Powiedzmy,
e mamy dokument Venus.txt w folderze Astronomy i stworzylimy alias lub skrt do tego
dokumentu (na przykad na pulpicie) o nazwie Evening_Star. Zarwno skrt, jak i sam
dokument odwouj si do tej samej wartoci (zawartoci otwartego dokumentu) i dowolne
zmiany tej zawartoci bd uwzgldnione niezalenie od tego, czy otworzymy dokument
za porednictwem skrtu Evening_Star, czy te za pomoc oryginalnego pliku Venus.txt.
Rnica jest jednak taka, e plik Venus.txt ma 40 KB, podczas gdy skrt jedynie 2 KB.

53

Rozdzia 1.

Aby wykorzysta odwoania


1. W edytorze tekstowym utworzymy nowy

dokument HTML (skrypt 1.11):



 

 !" "# 

 %&''''#()$) * 
$$+*   !" "# , , * !. %&''''#(///*  " 1-# "3 #%"45!5" " 1 1,7#,8-

2. Rozpoczniemy wpisywanie treci dokumentu

HTML oraz umiecimy inicjujcy znacznik


PHP:
7#,8:% %

3. Zapiszemy funkcj, ktra bdzie sumowa

Funkcje a odwoania

trafne i bdne typy.


>D < "# ,#= 1= ?AED1@A518@A # BF
">?A518.BF
A" 1.1*%#,1?G @AED1BC
AD!1 1.A" 1RSC
A # RAD!1 1SR'" !ST.A" 1RSC
A # RAD!1 1SR#!!1!ST.A" 1R$SC
H
H

Funkcja ta otrzymuje warto z tablicy, jej


indeks oraz tablic " . Warto, ktra
jest przekazywana w formacie 2+F;+
GH*<6;21<+)*+,-*9+:2)*+,-,IJ2
)9*92-, zostanie zdekomponowana pod

warunkiem, e nie jest to pierwszy element


tablicy (" K3&) wiersz atrapa.
Nastpnie sumowane s trafne i bdne typy
danego uytkownika.

54

4. Utworzymy funkcj, ktra odczytuje

z plikw wyniki ze wszystkich tygodni:


>D < "# 1,=1!D !?A,%@A,"1< #8@
bA # BF
">?A>"1= 1.1,,"?A,%BBF
">?!D7! ?A>"1= 1@@9B..
1!D !=BF
A 1=>"1.A,"1< #8A>"1= 1C
8='5?>"1?A 1=>"1B@
I,#= 1= I@bA # BC
H
1,=1!D !?A,%@A,"1< #8@A # BC
H
H

Funkcja  #> #  otrzymuje trzy


argumenty wskanik na katalog
(utworzony w momencie otwierania
katalogu), nazw katalogu oraz tablic
" . Ta ostatnia zmienna jest zawsze
przekazywana przez odwoanie, a nie przez
warto, tak wic wszystkie dokonane
zmiany dla tej zmiennej wewntrz funkcji
bd dotyczyy zmiennej poza funkcj.
Funkcja  #> #  wykonuje si
w ptli dla kadego pliku w katalogu
(zauwamy, e w funkcji zastosowano
rekurencj funkcja wywouje sam
siebie). W przypadku rozpoznania pliku
z wynikami, ktry charakteryzuje si
nazw postaci results_WEEK_.txt, plik
ten bdzie odczytany do tablicy, a tablica
zostanie przekazana przez odwoanie
do funkcji    . Dziki temu
dowolne zmiany w tablicy " poza
funkcj bd odzwierciedlone w obrbie
funkcji  #> # .

Zaawansowane programowanie w PHP


Skrypt 1.11. Ostatni skrypt w tej aplikacji WWW odczytuje wszystkie pliki z wynikami. Wykorzystano w nim
odwoania w celu obliczenia podsumowa dla sezonu do aktualnej daty

55

Funkcje a odwoania


 
 !" "# 

$ %&''''#()$) * $$+*   !" "# , , * !. %&''''#(///* 0 " 1-# "3 #%"45!5" " 12 1,+7#,86:% %
9
/VV
V7"<31 "1'8 "5M'!13# DV
VV
$
>D < "# ,#= 1= ?AED1@A518@A # BFZD 5<Y!DDY1 > 1"74L, 1 8%8
DO8 5#' "5M'
0
2">?A518.BF( #DY18%"1'!38'"1!3 %L
+
6A" 1.1*%#,1?G @AED1BC8,3"18 3'LDO8 5#' "5#3 > 1
"74L, 1 8%8
9AD!1 1.A" 1RSC
/A # RAD!1 1SR'" !ST.A" 1RSC
$A # RAD!1 1SR#!!1!ST.A" 1R$SC
$H
$$H
$
2#& ! #  #& (:#&#!;
$2
$+">?A>"1= 1.1,,"?A,%BBF
31!3D5"' "15 #(D
$6">?!D7! ?A>"1= 1@@9B..1!D !=BF[1O1"Y1!  #%"53'8 "5"
$9A 1=>"1.A,"1< #8A>"1= 1C
! !(!  #*&#*"!#*:#&#! (&!&.%<
!!(*
H
1,=1!D !?A,%@A,"1< #8@A # BC
#' 3 "1#%1<Y",5#1Y 8< %"5M'
'5 #(D
$H
H
0
2A # .8?BCK" "<Y#' "1(4M' 1Y3"1 1Y
+
6A,"1< #8.I$IC
9A,%.#%1 ,"?A,"1< #8BC
/1,=1!D !?A,%@A,"1< #8@A # BCD< #"1 "1%#<1!D
0<#!1,"?A,%BC
01< #%1-G C
0$%" =?A # BCW3875"1'8Q'"1 1 "1'8 "5M'
01< #%1-G C
00:027#,80+ -

Rozdzia 1.
5. Tworzymy gwn zmienn, otwieramy

katalog i rozpoczynamy proces oblicze.


A # .8?BC
A,"1< #8.I$IC
A,%.#%1 ,"?A,"1< #8BC
1,=1!D !?A,%@A,"1< #8@A # BC
<#!1,"?A,%BC

6. Wywietlamy obliczenia w przegldarce

WWW.

Funkcje a odwoania

1< #%1-G C
%" =?A # BC
1< #%1-G C

Funkcja    pobiera zmienn jako


argument i wywietla jej zawarto oraz
struktur. Dziki temu funkcja ta jest bardzo
uytecznym sposobem szybkiej analizy
skomplikowanych tablic i obiektw.
Moglibymy te pobra t tablic i w celu
wywietlenia wynikw utworzy formaln
tabel. Funkcja    jest nowoci w
PHP4. Uytkownicy wczeniejszej wersji
powinni zamiast niej skorzysta z funkcji
 > .

Rysunek 1.14. Jak wida, skrypt process_season.php


po prostu wywietla wyniki. Po uzyskaniu tej
informacji mona j bardzo atwo przesa
poczt elektroniczn

7. Zamykamy kod PHP oraz dokument HTML.


:7#,8 -

8. Zapisujemy ten plik pod nazw process_

season.php, kopiujemy go na serwer


i uruchamiamy w przegldarce WWW
(rysunek 1.14).

56

Rysunek 1.15. Funkcja var_dump() wywietla te


same informacje, co funkcja print_r() (rysunek 1.14),
ale zawiera nieco wicej danych

Zaawansowane programowanie w PHP


Wskazwki
 Aby porwna funkcj    z funkcj
 > , naley zmieni ostatni wiersz

w skrypcie process_season.php (skrypt 1.11)


na  > " , a nastpnie uruchomi
ten skrypt w przegldarce (rysunek 1.15).
 Zastosowanie znacznikw HTML !!

Rysunek 1.16. Prba wykonania funkcji print_r


lub funkcji var_dump() bez znacznikw <pre></pre>
powoduje wywietlenie brzydkiego, nieczytelnego
wyniku

powoduje wywietlanie tablicy w przegldarce


w formacie rda. Na rysunku 1.16 pokazano,
jak wygldaby wynik bez tych znacznikw,
chocia rdo (rysunek 1.17) jest czytelne.
 Wicej informacji na temat odwoa mona

znale pod adresem www.php.net/manual/


en/language.references.php.

Funkcje a odwoania

Rysunek 1.17. Przegldanie rda wyniku


pokazanego na rysunku 1.16 powoduje popraw
jakoci wywietlania tablicy, ktra zostaa
wywietlona przez funkcj var_dump().
W zasadzie odpowiada to rysunkowi 1.15,
gdzie uyto znacznikw <pre></pre>

57

You might also like