You are on page 1of 24

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

PHP. Stwrz wasn


stron internetow
Autor: Praca zbiorowa
Tumaczenie: Rafa Joca (rozdz. 22 26, 28 33),
Marek Paczyski (rozdz. 3, 7, 10 13, 15), Ewa Sawiska
(wprowadzenie, rozdz. 1, 2, 4 6, 8, 9, 14, 16 21, 27)
ISBN: 83-7361-665-9
Tytu oryginau: Creating Your Web Site with PHP
Format: B5, stron: 496
Przykady na ftp: 55 kB
Ksika PHP. Stwrz wasn stron internetow to podrcznik przedstawiajcy zasady
tworzenia aplikacji internetowych z wykorzystaniem jzyka PHP i bazy danych MySQL.
Wedug zaoe autora ma on pomc nawet najmniej dowiadczonym programistom
w zdobyciu kwalifikacji niezbdnych do rozpoczcia kariery zawodowej w wiecie
tworzenia aplikacji internetowych. Kade poruszone w nim zagadnienie ilustrowane
jest starannie dobranymi przykadami metod programowania, ktre pomog nauczy
si tworzenia wysokiej jakoci aplikacji. Niemal we wszystkich rozdziaach ksiki
prezentowane s najbardziej praktyczne i najczciej wykorzystywane sztuczki
programistyczne (majce zwizek nie tylko z jzykiem PHP).
Podstawowe informacje o funkcjonowaniu internetu
Zasady dziaania skryptw uruchamianych po stronie serwera
Instalacja i konfiguracja serwera Apache, platformy PHP i bazy danych MySQL
Szczegowy opis jzyka PHP
Korzystanie z bazy danych MySQL
Tworzenie aplikacji moduowych
Programowanie obiektowe w jzyku PHP
Zawarte w tej ksice wiadomoci pomog kademu programicie stworzy doskona
aplikacj internetow.

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

Spis treci
Wprowadzenie ..............................................................................13

Cz I

Programowanie na potrzeby sieci podstawy ................19

Rozdzia 1. Podstawy funkcjonowania internetu................................................21


Protokoy transmisji danych ....................................................................................... 21
Rodzina TCP/IP ......................................................................................................... 23
Adresowanie w sieci .................................................................................................. 24
Adresy IP............................................................................................................. 24
Nazwy domen ...................................................................................................... 26
Porty.................................................................................................................... 28
Terminologia ............................................................................................................. 30
Serwery ............................................................................................................... 30
Wzy .................................................................................................................. 30
Porty.................................................................................................................... 31
Demony sieciowe................................................................................................. 31
Usugodawcy ....................................................................................................... 31
Hosty................................................................................................................... 32
Hosty wirtualne.................................................................................................... 32
Dostawcy usug hostingowych.............................................................................. 32
Witryny internetowe............................................................................................. 33
Pliki HTML ......................................................................................................... 33
Strony internetowe (lub strony HTML) ................................................................. 33
Programowanie na potrzeby sieci.......................................................................... 33
Sie WWW a adresy URL .......................................................................................... 34
Protok transmisji danych ................................................................................... 34
Nazwa hosta ........................................................................................................ 35
Numer portu ........................................................................................................ 35
cieka dostpu do strony .................................................................................... 35

Rozdzia 2. Interfejs CGI .................................................................................37


Czym jest CGI? ......................................................................................................... 37
Tajemnice adresw URL ............................................................................................ 38
Nagwki a metoda GET ............................................................................................ 39
GET .................................................................................................................... 41
POST................................................................................................................... 41
Content-Type ....................................................................................................... 41
User-Agent .......................................................................................................... 42

PHP. Stwrz wasn stron internetow


Referer................................................................................................................. 42
Content-length ..................................................................................................... 42
Cookie................................................................................................................. 43
Accept ................................................................................................................. 43
Imitowanie przegldarki poprzez telnet................................................................. 43
Metoda POST ............................................................................................................ 44
Kodowanie URL ........................................................................................................ 45
Formularze oraz ich zastosowanie............................................................................... 45
Rczne podstawianie parametrw ......................................................................... 46
Korzystanie z formularza...................................................................................... 46
Wzgldne i bezwzgldne cieki dostpu do skryptu ............................................. 47
Formularze a metoda POST.................................................................................. 48

Rozdzia 3. Szczegy dziaania skryptw CGI ...................................................51


Przesyanie dokumentu do uytkownika...................................................................... 52
Nagwki odpowiedzi........................................................................................... 53
Przykadowy skrypt CGI ...................................................................................... 55
Przekazywanie danych do skryptu CGI ....................................................................... 56
Zmienne rodowiskowe........................................................................................ 57
Przekazywanie parametrw za pomoc metody GET............................................. 59
Przekazywanie parametrw za pomoc metody POST........................................... 59
Dekodowanie danych zapisanych w formacie adresu URL..................................... 61
Formularze ................................................................................................................ 64
Okrelanie rodzajw pl danych za pomoc znacznika <input> ............................. 65
Tworzenie wieloliniowych pl tekstowych za pomoc znacznika <textarea>.......... 69
Tworzenie list za pomoc znacznika <select>........................................................ 70
Przesyanie plikw ..................................................................................................... 71
Format danych ..................................................................................................... 71
Znacznik przesania pliku ..................................................................................... 73
Czym s dane cookie i do czego su? ....................................................................... 74
Zapis danych cookie............................................................................................. 76
Pobieranie danych cookie z przegldarki............................................................... 78
Przykadowy program obsugi danych cookie........................................................ 78
Autoryzacja ............................................................................................................... 80

Cz II

Wybr i konfiguracja narzdzi serwer Apache..............83

Rozdzia 4. Instalowanie serwera Apache.........................................................85


Po co komu serwer domowy....................................................................................... 85
Oprogramowanie i materiay referencyjne................................................................... 86
Instalacja serwera Apache .......................................................................................... 86
Etap 1. instalacja .................................................................................................. 87
Etap 2. edycja pliku konfiguracyjnego serwera Apache ......................................... 88
Etap 3. testowanie serwera Apache ....................................................................... 91
Hosty wirtualne serwera Apache................................................................................. 94

Rozdzia 5. Instalowanie PHP i MySQL-a ..........................................................99


Instalowanie PHP..................................................................................................... 100
Konfiguracja serwera Apache pod ktem wsppracy z PHP...................................... 101
Testowanie PHP....................................................................................................... 102
Instalowanie moduw dodatkowych ........................................................................ 103
Instalowanie MySQL-a ............................................................................................ 104
Testowanie MySQL-a .............................................................................................. 106

Spis treci

Cz III Podstawy jzyka PHP ...................................................109


Rozdzia 6. Cechy szczeglne jzyka PHP.......................................................111
Interpreter kontra kompilator.................................................................................... 112
Zalety i wady interpretera......................................................................................... 113
Przykadowy program w PHP................................................................................... 115
Korzystanie z PHP w sieci........................................................................................ 120

Rozdzia 7. Zmienne, stae i wyraenia...........................................................123


Zmienne .................................................................................................................. 123
Typy zmiennych ................................................................................................ 124
Stosowanie zmiennych ....................................................................................... 127
Ustalenie typu zmiennej ..................................................................................... 128
Nadawanie zmiennym typw.............................................................................. 129
Operator przypisania ................................................................................................ 129
Zmienne referencyjne............................................................................................... 130
Referencje stae.................................................................................................. 130
Referencje znakowe ........................................................................................... 131
Konwencje............................................................................................................... 132
string ................................................................................................................. 132
int, long ............................................................................................................. 133
double, float....................................................................................................... 133
bool ................................................................................................................... 133
array .................................................................................................................. 133
list ..................................................................................................................... 133
object................................................................................................................. 133
void ................................................................................................................... 133
mixed ................................................................................................................ 134
Stae ........................................................................................................................ 134
Stae predefiniowane.......................................................................................... 134
Definiowanie staych.......................................................................................... 135
Sprawdzenie istnienia staej................................................................................ 136
Wyraenia ............................................................................................................... 136
Wyraenia logiczne ............................................................................................ 137
Wyraenia tekstowe ........................................................................................... 138
Operatory ................................................................................................................ 141
Operatory arytmetyczne ..................................................................................... 141
Operatory tekstowe ............................................................................................ 141
Operatory przypisania ........................................................................................ 141
Operatory inkrementacji i dekrementacji............................................................. 142
Operatory bitowe ............................................................................................... 143
Operatory porwnania........................................................................................ 143
Operator identycznoci ....................................................................................... 144
Operatory logiczne ............................................................................................. 145
Operator wyczenia komunikatw ..................................................................... 145

Rozdzia 8. Przetwarzanie danych z formularzy................................................147


Transmisja danych linia polece .......................................................................... 147
Formularze .............................................................................................................. 149
Konwersja elementw kontrolnych formularza na zmienne.................................. 150
Konwersja zmiennych rodowiskowych i plikw cookie ........................................... 152
Konwersja list.......................................................................................................... 153
Konwersja tablic ...................................................................................................... 154

PHP. Stwrz wasn stron internetow

Rozdzia 9. Konstrukcje skadniowe jzyka PHP..............................................157


Struktura kontrolna if-else ........................................................................................ 157
Posugiwanie si skadni alternatywn........................................................................ 158
Przedwarunkowa ptla while .................................................................................... 159
Powarunkowa ptla do-while.................................................................................... 160
Ptla uniwersalna for................................................................................................ 160
Wyraenia break oraz continue................................................................................. 161
Niezwyke zastosowania wyrae do-while oraz break.............................................. 162
Ptla foreach ............................................................................................................ 163
Struktura kontrolna switch-case ................................................................................ 164
Wyraenie require.................................................................................................... 165
Wyraenie include ................................................................................................... 166
Translacja i problemy z uyciem wyraenia include .................................................. 166
Wyraenia typu _once .............................................................................................. 167

Rozdzia 10. Tablice asocjacyjne.....................................................................171


Dynamiczne tworzenie tablic.................................................................................... 172
Funkcja list()............................................................................................................ 173
Listy i tablice asocjacyjne......................................................................................... 174
Funkcja array() i tablice wielowymiarowe................................................................. 174
Przetwarzanie tablic ................................................................................................. 176
Dostp za pomoc kluczy ................................................................................... 176
Funkcja count().................................................................................................. 176
czenie tablic ................................................................................................... 177
Porednie przeszukiwanie tablic ......................................................................... 178
Bezporednie przeszukiwanie tablic.................................................................... 180
Tablice i cigi znakowe............................................................................................ 181
Serializacja .............................................................................................................. 182

Rozdzia 11. Funkcje i zakres widocznoci zmiennych .......................................185


Przykad funkcji....................................................................................................... 186
Oglna skadnia definicji funkcji .............................................................................. 188
Instrukcja return................................................................................................. 188
Parametry domylne........................................................................................... 189
Przekazywanie parametrw przez referencj ....................................................... 190
Zmienna liczba parametrw funkcji .................................................................... 191
Zmienne lokalne ...................................................................................................... 193
Zmienne globalne .................................................................................................... 193
Tablica $GLOBALS .......................................................................................... 194
Zmienne statyczne ................................................................................................... 196
Rekurencja............................................................................................................... 197
Funkcje zagniedone .............................................................................................. 197
Warunkowa definicja funkcji.................................................................................... 199
Przekazywanie funkcji przez referencj ................................................................. 200
Zwracanie referencji przez funkcj ........................................................................... 201
Przykad funkcji Dump() ..................................................................................... 202
Kilka rad dotyczcych wykorzystania funkcji............................................................ 203

Cz IV Standardowe funkcje PHP ............................................205


Rozdzia 12. Funkcje operujce na cigach tekstowych ....................................207
Konkatenacja cigw tekstowych ............................................................................. 208
Porwnywanie cigw tekstowych instrukcja if-else............................................. 208
Funkcja przetwarzania pojedynczych znakw ........................................................... 210

Spis treci

7
Funkcje usuwania znakw spacji .............................................................................. 211
Funkcje podstawowe................................................................................................ 212
Przetwarzanie blokw tekstu .................................................................................... 213
Funkcje konwersji znakw ....................................................................................... 215
Funkcje zmiany wielkoci liter ................................................................................. 217
Ustawianie parametrw lokalizacyjnych ................................................................... 218
Funkcje formatujce................................................................................................. 219
Przetwarzanie danych binarnych............................................................................... 221
Funkcje mieszajce .................................................................................................. 223
Oprnianie bufora wyjciowego.............................................................................. 225

Rozdzia 13. Wykorzystanie tablic ...................................................................227


Sortowanie tablic ..................................................................................................... 227
Sortowanie wzgldem wartoci funkcje asort() i arsort() ................................. 227
Sortowanie wzgldem klucza funkcje ksort() i krsort().................................... 228
Sortowanie wzgldem klucza funkcja uksort()................................................ 228
Sortowanie wzgldem wartoci funkcja uasort() ............................................. 229
Odwrcenie kolejnoci elementw tablicy funkcja array_reverse().................. 229
Sortowanie list funkcje sort() i rsort()............................................................. 229
Sortowanie list funkcja usort() ....................................................................... 230
Losowy rozkad elementw listy funkcja shuffle().......................................... 230
Klucze i wartoci ..................................................................................................... 230
Zastpowanie fragmentu cigu tekstowego ............................................................... 231
czenie tablic......................................................................................................... 232
Dzielenie tablicy ...................................................................................................... 233
Wstawianie i usuwanie elementw ........................................................................... 233
Zmienne i tablice ..................................................................................................... 235
Tworzenie list o wartociach z okrelonego przedziau .............................................. 237

Rozdzia 14. Funkcje matematyczne................................................................239


Wbudowane stae..................................................................................................... 239
Funkcje zaokrglajce .............................................................................................. 239
Liczby losowe.......................................................................................................... 240
Konwersja pomidzy rnymi systemami liczbowymi............................................... 242
Wartoci minimalne i maksymalne ........................................................................... 243
Funkcje wykadnicze................................................................................................ 243
Funkcje trygonometryczne ....................................................................................... 244

Rozdzia 15. Obsuga plikw ...........................................................................245


Pliki tekstowe i binarne ............................................................................................ 245
Otwieranie pliku ...................................................................................................... 246
Konstrukcja or die() ........................................................................................... 249
Tymczasowe pliki bez nazw ............................................................................... 250
Zamykanie pliku ...................................................................................................... 250
Odczytywanie i zapisywanie plikw ......................................................................... 251
Odczyt i zapis blokw danych ............................................................................ 251
Odczyt i zapis pojedynczych linii tekstu.............................................................. 252
Odczyt pliku CSV .............................................................................................. 252
Wskanik pliku ........................................................................................................ 253
Funkcje okrelajce typy plikw............................................................................... 254
Okrelenie typu pliku ......................................................................................... 254
Okrelanie dostpnoci pliku .............................................................................. 255
Okrelanie parametrw plikw ................................................................................. 256
Funkcje specjalistyczne ...................................................................................... 257

PHP. Stwrz wasn stron internetow


Obsuga nazw plikw............................................................................................... 257
Funkcje przetwarzania caych plikw........................................................................ 259
Inne funkcje............................................................................................................. 261
Blokowanie plikw .................................................................................................. 262
Rodzaje blokad .................................................................................................. 263
Blokowanie bez wstrzymywania pracy programu ................................................ 266
Przykad licznika wizyt ............................................................................................ 266

Rozdzia 16. Obsuga katalogw......................................................................269


Manipulowanie katalogami....................................................................................... 269
Obsuga rekordw.................................................................................................... 270
Przykad wywietlanie struktury katalogw .......................................................... 272

Rozdzia 17. Potoki i dowizania symboliczne...................................................275


Potoki...................................................................................................................... 275
Dowizania symboliczne.......................................................................................... 277
Dowizania twarde................................................................................................... 278

Rozdzia 18. Uruchamianie programw zewntrznych ........................................279


Rozdzia 19. Funkcje daty i czasu....................................................................283
Okrelanie czasu w formacie timestamp.................................................................... 283
Okrelanie daty ........................................................................................................ 284
Kalendarz gregoriaski............................................................................................. 286

Rozdzia 20. Przesyanie wiadomoci e-mail w PHP ...........................................289


Funkcja przesyania wiadomoci e-mail.................................................................... 289
Zaawansowane przesyanie wiadomoci e-mail tworzenie funkcji inteligentnej .. 290

Rozdzia 21. Wsppraca z sieci WWW............................................................291


Ustawianie nagwkw odpowiedzi.......................................................................... 291
Tworzenie nagwkw ....................................................................................... 291
Zakaz uycia pamici podrcznej........................................................................ 292
Pozyskiwanie nagwkw zapyta............................................................................ 292
Obsuga cookie ........................................................................................................ 293
Zaoenia teoretyczne......................................................................................... 293
Ustawianie cookie .............................................................................................. 294
Pozyskiwanie cookie .......................................................................................... 296
SSI i funkcja virtual()............................................................................................... 296
Imitowanie funkcji virtual()................................................................................ 297

Rozdzia 22. Podstawy wyrae regularnych w formacie RegEx..........................299


Zacznijmy od przykadw ........................................................................................ 299
Przykad pierwszy .............................................................................................. 299
Przykad drugi.................................................................................................... 300
Wnioski ............................................................................................................. 300
Terminologia ........................................................................................................... 301
Korzystanie z wyrae regularnych w jzyku PHP .................................................... 301
Wyszukiwanie ................................................................................................... 301
Zastpowanie..................................................................................................... 301
Jzyk RegEx ............................................................................................................ 302
Proste znaki ....................................................................................................... 302
Grupy zanegowane............................................................................................. 304
Kwantyfikatory powtrze ................................................................................. 305
Znaki urojone..................................................................................................... 306

Spis treci

9
Operator alternatywy .......................................................................................... 307
Nawiasy grupujce............................................................................................. 307
Wydobywanie grup ............................................................................................ 307
Funkcje pomocnicze................................................................................................. 310
Przykady uycia wyrae regularnych ..................................................................... 311
Nazwy plikw i rozszerzenia .............................................................................. 311
Nazwa pliku i katalogu....................................................................................... 311
Test identyfikatora ............................................................................................. 311
Modyfikacja znacznikw.................................................................................... 312
Konwersja hipercza ......................................................................................... 312
Konwersja adresw e-mail.................................................................................. 312
Pobranie wszystkich unikatowych wyrazw tekstu.............................................. 313
Wnioski................................................................................................................... 314

Rozdzia 23. Praca z obrazami.........................................................................315


Uniwersalna funkcja GetImageSize()........................................................................ 316
Praca z obrazami i bibliotek GD.............................................................................. 316
Przykad .................................................................................................................. 317
Tworzenie obrazu .................................................................................................... 317
Pobranie atrybutw obrazu ....................................................................................... 318
Zapis obrazu ............................................................................................................ 319
Korzystanie z kolorw w formacie RGB................................................................... 320
Utworzenie nowego koloru................................................................................. 320
Pobranie najbliszego koloru .............................................................................. 321
Przezroczysto.................................................................................................. 321
Pobranie komponentw RGB ............................................................................. 322
Prymitywy graficzne ................................................................................................ 322
Kopiowanie obrazw.......................................................................................... 322
Prostokty.......................................................................................................... 323
Linie.................................................................................................................. 323
uki................................................................................................................... 324
Wypenienie dowolnego obszaru ........................................................................ 324
Wieloboki.......................................................................................................... 324
Dostp do poszczeglnych pikseli....................................................................... 325
Czcionki o staym rozmiarze .................................................................................... 325
Wczytywanie czcionek....................................................................................... 325
Parametry czcionek ............................................................................................ 326
Naoenie tekstu na obraz................................................................................... 326
Korzystanie z czcionek TrueType ............................................................................. 327
Naoenie tekstu na obraz................................................................................... 327
Pobranie granic tekstu ........................................................................................ 328
Przykad ............................................................................................................ 328

Rozdzia 24. Sterowanie interpreterem ............................................................331


Funkcje informacyjne............................................................................................... 331
Ustawianie parametrw PHP .................................................................................... 332
Parametr error_reporting .................................................................................... 333
Parametr magic_quotes_gpc on/off ..................................................................... 333
Parametr max_execution_time............................................................................ 334
Parametr track_vars on/off.................................................................................. 334
Sterowanie bdami.................................................................................................. 334
Operator wyczania bdw............................................................................... 335
Przykad zastosowania operatora @ .................................................................... 335

10

PHP. Stwrz wasn stron internetow


Wymuszanie zakoczenia programu ......................................................................... 336
Funkcje wyczania skryptu...................................................................................... 336
Generowanie kodu w trakcie wykonywania skryptu .................................................. 337
Wykonywanie kodu ........................................................................................... 338
Generowanie funkcji .......................................................................................... 340
Sprawdzanie poprawnoci kodu.......................................................................... 341
Inne funkcje............................................................................................................. 342

Rozdzia 25. Sesje .........................................................................................343


Do czego przydaj si sesje?..................................................................................... 343
Sesje w praktyce ...................................................................................................... 344
Inicjalizacja sesji...................................................................................................... 345
Rejestracja zmiennych.............................................................................................. 345
Identyfikator sesji i nazwa grupy .............................................................................. 346
Nazwy grup sesji................................................................................................ 346
Identyfikator sesji............................................................................................... 347
Inne funkcje............................................................................................................. 348
Ustawienie procedur obsugi sesji............................................................................. 349
Omwienie procedur obsugi .............................................................................. 349
Rejestracja procedur obsugi............................................................................... 350
Przykad redefinicja procedur obsugi sesji........................................................... 351
Sesje i cookies ......................................................................................................... 353
Jawne wykorzystanie staej SID.......................................................................... 353
Niejawna zmiana czy internetowych ................................................................ 354
Niejawna zmiana formularzy .............................................................................. 355
Czy cookies powinny by stosowane w sesjach? ................................................. 355

Rozdzia 26. Praca z baz danych MySQL .........................................................357


Wady stosowania plikw.......................................................................................... 358
Podstawy MySQL-a ................................................................................................. 359
czenie z baz danych ...................................................................................... 360
Obsuga bdw ....................................................................................................... 360
Wysyanie zapyta do bazy danych........................................................................... 361
Jzyk SQL ............................................................................................................... 361
Tworzenie tabeli ................................................................................................ 362
Usunicie tabeli ................................................................................................. 365
Wstawienie rekordu ........................................................................................... 365
Usunicie rekordu .............................................................................................. 366
Wyszukiwanie rekordu....................................................................................... 366
Aktualizacja rekordu .......................................................................................... 366
Zliczenie rekordw speniajcych wyraenie....................................................... 366
Pobranie unikatowych wartoci rekordw ........................................................... 367
Pobranie wynikw ................................................................................................... 367
Atrybuty wyniku ................................................................................................ 367
Pobranie pola wyniku......................................................................................... 368
Pobranie wiersza wyniku.................................................................................... 368
Pobranie informacji o wyniku............................................................................. 369
Przykad wykorzystania funkcji MySQL ............................................................. 371
Unikatowe identyfikatory w MySQL-u ..................................................................... 371
Praca z tabelami....................................................................................................... 372

Rozdzia 27. Funkcje sieciowe ........................................................................375


Obsuga gniazd ........................................................................................................ 375
Funkcje obsugujce DNS ........................................................................................ 377
Konwersja adresw IP na nazwy domen i odwrotnie ........................................... 377
Prawidowa konwersja adresu IP na nazw domeny ............................................ 378

Spis treci

11

Cz V

Techniki programistyczne .............................................381

Rozdzia 28. Umieszczanie plikw na serwerze .................................................383


Formularze multipart................................................................................................ 383
Znacznik wyboru pliku............................................................................................. 384
Umieszczanie plikw na serwerze a bezpieczestwo ................................................. 384
Obsuga umieszczania plikw w jzyku PHP ............................................................ 385
Proste nazwy dla elementw umieszczania plikw .............................................. 385
Przykad album zdj..................................................................................... 386
Zoone nazwy elementw ................................................................................. 388
Problemy zwizane z nazwami zoonymi .......................................................... 388

Rozdzia 29. Programy moduowe tworzenie bibliotekarza..............................391


Wymagania.............................................................................................................. 391
Bibliotekarz ............................................................................................................. 392
Korzystanie z bibliotekarza ...................................................................................... 396
Automatyczne doczanie bibliotekarza ....................................................................... 398
Sposb pierwszy wykorzystanie dyrektywy auto_prepend_file........................ 398
Sposb drugi instalacja uchwytu serwera Apache ........................................... 399
Uchwyty serwera Apache......................................................................................... 399
Przechwytywanie dostpu do nieistniejcych stron.............................................. 402
Powizanie PHP z innymi rozszerzeniami........................................................... 403
Rozwizanie problemu ptli nieskoczonej ......................................................... 404

Rozdzia 30. Kod i szablon strony WWW .............................................................405


Ideologia ................................................................................................................. 405
Podejcie dwuwarstwowe......................................................................................... 406
Szablon strony ................................................................................................... 407
Generator danych ............................................................................................... 408
Interakcja midzy generatorem danych a szablonem............................................ 409
Ograniczenia...................................................................................................... 410
Podejcie trjwarstwowe .......................................................................................... 411
Szablon strony ................................................................................................... 411
Schematy modeli dwu- i trjwarstwowych .......................................................... 413
Interfejs ............................................................................................................. 414
Jdro.................................................................................................................. 414
Walidacja wprowadzanych danych ..................................................................... 415
Zarzdca szablonw................................................................................................. 416
Tworzenie stron WWW w sposb tradycyjny ...................................................... 417
Rozdzielanie szablonu........................................................................................ 418
Czym jest zarzdca szablonw? .......................................................................... 419
Opis zarzdcy szablonw ................................................................................... 420
Uchwyt serwera Apache dla zarzdcy szablonw ................................................ 426
Gwny modu zarzdcy szablonw.................................................................... 426
Przechwytywanie strumienia wyjciowego................................................................ 431
Stos buforw...................................................................................................... 432
Problemy zwizane z debugowaniem.................................................................. 433

Rozdzia 31. Programowanie obiektowe w PHP.................................................435


Klasy i obiekty......................................................................................................... 436
Waciwoci obiektw........................................................................................ 436
Metody .............................................................................................................. 437
Klasa tabeli bazy danych MySQL ....................................................................... 438
Dostp do waciwoci obiektu................................................................................. 440
Inicjalizacja obiektw konstruktory...................................................................... 441

12

PHP. Stwrz wasn stron internetow


Destruktory.............................................................................................................. 442
Dziedziczenie .......................................................................................................... 442
Polimorfizm............................................................................................................. 444
Klasa tabeli bazy danych MySQL ............................................................................. 445
Kopiowanie obiektw .............................................................................................. 454
Referencje i interfejsy ........................................................................................ 455
Zwracanie referencji do obiektu.......................................................................... 456
Zwracanie interfejsu........................................................................................... 457

Rozdzia 32. Szablony listw e-mail .................................................................461


Miniaturowy zarzdca szablonw ............................................................................. 461
Wysyanie i kodowanie listw .................................................................................. 463
Przykad .................................................................................................................. 465

Rozdzia 33. Rne rady i wskazwki...............................................................469


Wspdzielenie czasu ............................................................................................... 469
Korzystanie z przekierowania do samego siebie ........................................................ 472
Zabronienie buforowania stron przez przegldarki .................................................... 474
Kilka sw na temat opcji formularzy........................................................................ 475

Dodatki ......................................................................................477
Skorowidz...................................................................................479

Rozdzia 9.

Konstrukcje skadniowe
jzyka PHP
W niniejszym rozdziale omwimy konstrukcje skadniowe jzyka PHP. O niektrych
z nich, na przykad o wyraeniu if, bya ju okazja wspomnie wczeniej. Tym razem
jednak zapoznamy si z penym wachlarzem konstrukcji. Nie jest ich zbyt wiele, co
na pewno naley zaliczy do plusw jzyka PHP. Jak pokazuje praktyka, im bardziej
zwiza skadnia jzyka programowania, tym atwiej si nim posugiwa. PHP jest
doskonaym przykadem prawdziwoci tej teorii.

Struktura kontrolna if-else


Zaczynamy od omwienia najprostszej konstrukcji, mianowicie wyraenia warunkowego. Jego skadnia wyglda tak:
if(wyraenie_logiczne)
wyraenie_1;
else
wyraenie_2;

Konstrukcja ta funkcjonuje tak, e gdy speniony jest warunek wyrazenie_logiczne, to


nastpuje wykonanie wyraenia wyrazenie_1. Gdy wspomniany warunek nie zostanie
speniony, wykonywane jest wyraenie wyrazenie_2. Podobnie jak ma to miejsce w innych
jzykach programowania, konstrukcj else mona opuci. Wwczas w przypadku
niespenienia warunku nie bdzie podejmowana adna akcja.
Oto przykad:
if($a>=1&&$b<=10) echo "Wszystko w porzdku";
else echo "Nieprawidowa warto!";

Gdy zachodzi potrzeba zagniedenia kilku wyrae w obrbie jednego, uywa si do


tego celu nawiasw klamrowych, jak w poniszym przykadzie:

Cz III Podstawy jzyka PHP

158
if($a>$b) { print "a jest wiksze od b"; $c=$b; }
elseif($a==$b) { print "a jest rwne b"; $c=$a: }
else {print "a jest mniejsze od b"; $c=$b; }

Uwaga w powyszym skrypcie nie bdu! Zamiast else if mona rwnie dobrze pisa
elseif (czyli bez spacji pomidzy tymi dwoma poleceniami), ale prawdopodobnie wikszo programistw uzna pierwszy sposb zapisu za bardziej czytelny.
Konstrukcja if-else ma take skadni alternatywn:
if(wyraenie_logiczne):
wyraenia;
elseif(inne_wyraenie_logiczne):
inne_wyraenia;
else:
wyraenia_alternatywne;
endif

Zwrmy uwag na dwukropek (:)! Jeli zapomnimy umieci go w skrypcie, wygenerowany zostanie komunikat o bdzie. Jak poprzednio, bloki elseif oraz else mona
pomin.

Posugiwanie si skadni alternatywn


W poprzednich rozdziaach wielokrotnie rozpatrywalimy przykady umieszczania kodu
HTML w skryptach. W tym celu naley po prostu zamkn skrypt znakiem ?>, wstawi
podany fragment kodu HTML, po czym kontynuowa skrypt po uprzednim zasygnalizowaniu jego pocztku znakiem <?.
Co prawda taki sposb zapisu nie wyglda zbyt elegancko, ale przy odrobinie wysiku
mona to zmieni. Wystarczy sign po skadni alternatywn oraz inne konstrukcje
jzyka.
Czsto zachodzi potrzeba umieszczenia kodu programu w obrbie dokumentu HTML,
rzadziej dzieje si odwrotnie. Tak jest wygodniej, na przykad, dla projektanta grafiki
strony, ktry jest odpowiedzialny za wygld kocowego dziea, a nie za pisanie skryptw.
Dlatego wanie powinno si dy do oddzielania kodu HTML od skryptu. Mona to
osign przez zapis kodu w odrbnym pliku, ktry bdzie w odpowiednim momencie
doczany do skryptu w rezultacie uycia wyraenia include (opis w dalszej czci
rozdziau). Do zagadnienia tego jeszcze powrcimy.
Poniej przedstawiamy alternatywny sposb zapisu skryptu powitalnego zaprezentowanego w poprzednim rozdziale. Korzystamy z konstrukcji if-else (listing 9.1).

Rozdzia 9. Konstrukcje skadniowe jzyka PHP

159

Listing 9.1. Konstrukcja if-else. Alternatywny sposb zapisu


<?if(@$go) :?>
Cze, <?=$name?>!
<?else:?>
<form action=<?=$REQUEST_URI?> method=post>
Twoje imi: <input type=text name=name><br>
<input type=submit name=go value="Przelij!">
<?endif?>

Czytelnicy zapewne zgodz si z tym, e skrypt w takiej postaci jest zrozumiay nawet
dla osoby, ktra nie zna PHP, ale, na przykad, orientuje si w kodzie HTML.

Przedwarunkowa ptla while


Ta konstrukcja to kolejny spadek po jzyku C. Jej zadanie polega na wielokrotnym
wykonywaniu wyrae zagniedonych w ptli tak dugo, jak dugo speniony bdzie
warunek wyraony w sprawdzonym uprzednio wyraeniu logicznym nagwka ptli.
W tym czasie konstrukcja wykonuje kolejne iteracje, ale natychmiast przerywa prac,
gdy tylko wyraenie logiczne zwrci warto false. Ptla ma nastpujc skadni:
while(wyraenie_logiczne)
wyraenie;

Znaczenie powyszej definicji jest oczywiste; nazwa wyraenie_logiczne mwi sama


za siebie, natomiast wyraenie to pojedyncze lub zoone wyraenie wchodzce w skad
ptli (oczywicie w celu niedopuszczenia do powstania ptli nieskoczonej konieczne
s pewne manipulacje majce na celu zmian wartoci wyraenia mona w tym celu
posuy si licznikiem). Jeli wartoci zwracan przez wyraenie bdzie od pocztku
false, to ptla nigdy nie zostanie wykonana. Oto przykad:
$i=1; $p=1;
while($i<32) {
echo $p," ";
$p=$p*2; // mona by napisa $p*=2
$i=$i+1; // mona by napisa $i+=1 lub nawet $i++
}

Skrypt wywietla liczby stanowice wynik dziaania podnoszcego 2 do potgi z zakresu od 1 do 31. Gdy zmiennej $i przypiszemy warto 32, adna operacja nie zostanie wykonana.
Podobnie jak wyraenie if, take ptla while ma skadni alternatywn, ktra uatwia
czenie skryptw z kodem HTML:
while(wyraenie_logiczne):
wyraenia;
endwhile;

Cz III Podstawy jzyka PHP

160

Powarunkowa ptla do-while


W przeciwiestwie do ptli while, ptla do-while sprawdza wyraenie logiczne po
wykonaniu kadej iteracji, a nie przed. Z tego wniosek, e ptla ta musi by wykonana
przynajmniej raz. Skadnia wyraenia jest nastpujca:
do {
wyraenia;
} while(wyraenie_logiczne);

Po kadej iteracji sprawdzana jest prawdziwo wyraenia logicznego jeli warunek


jest speniony, ptla wykonywana jest ponownie. W przeciwnym razie nastpuje przerwanie procesu.
Tego rodzaju ptla nie ma skadni alternatywnej, co wynika najprawdopodobniej std,
e ma ona nieczste zastosowanie w skryptach.

Ptla uniwersalna for


Okrelenie uniwersalna nie wzio si z powietrza ptla for w PHP pozwala
programistom tworzy konstrukcje znacznie mniej trywialne w porwnaniu z jej odpowiednikami z jzykw Pascal oraz C (tam ptla for suy jedynie do przechodzenia
przez kolejne wartoci zliczane przez licznik). Skadnia ptli wyglda nastpujco:
for(wyraenia_inicjujce; warunek_ptli; wyraenia_po_iteracji)
ciao_ptli;

Sprawdmy teraz, jak to dziaa. W momencie uruchomienia ptli wykonywane s wyraenia okrelone jako wyraenia_inicjujce (w kolejnoci od lewej do prawej). Oddziela
si je przecinkami, jak w poniszym przykadzie:
for($i=0,$j=10,$k="Test!"; .....)

Dalej rozpoczyna si iteracja. Najpierw sprawdzany jest warunek ptli (jak w konstrukcji
while) i, w przypadku jego spenienia (warto true (prawda)), nastpuje wykonanie
iteracji. Jeli warunek nie zostanie speniony, interpreter zakoczy ptl. Przykad:
// dodaje kolejn kropk
for($i=0,$j=0,$k="Test"; $i<10; .....) $k.=".";

Zamy, e wykonana zostaa jedna iteracja. W takim razie powinno doj do wykonania wyrae po iteracji, ktrych format jest identyczny jak wyrae inicjujcych.
Przykad:
for($i=0,$j=0,$k="Punkty"; $i<100; $j++,$i+=$j) $k=$k.".";

W tym miejscu naley wspomnie, e powyszy przykad (jak rwnie dowolny inny)
mona zaimplementowa take z wykorzystaniem ptli while. Taka konstrukcja nie
bdzie jednak wyglda rwnie dobrze jak ptla for. Oto przykad:

Rozdzia 9. Konstrukcje skadniowe jzyka PHP

161

$i=0;$j=0;$k="Punkty";
while($i<100) {
$k.=".";
$j++;$i+=$j;
}

C, to ju chyba wszystko Nie, chwileczk! Sprbuj jeszcze zgadn, ile kropek zostanie dodanych do zmiennej $k po zakoczeniu wykonywania ptli.
Ptla for podobnie jak wikszo pozostaych konstrukcji ma skadni alternatywn:
for(wyraenia_inicjujce; warunek_ptli; wyraenia_po_iteracji):
wyraenia;
endfor;

Wyraenia break oraz continue


Kontynuujemy dyskusj na temat ptli. Czasem zachodzi potrzeba przerwania biecej
iteracji (na przykad gdy zostanie speniony okrelony warunek). W tym celu zaprojektowano wyraenie break, ktre natychmiast koczy prac ptli. Wyraenie to moe
przyjmowa parametr opcjonalny, sucy do definiowania liczby zagniedonych ptli, ktre naleaoby przerwa. Domyln wartoci tego parametru jest 1 i wskazuje ona
na ptl biec. Od czasu do czasu uywa si jednak i innych wartoci:
for($i=0; $i<10; $i++) {
for($j=0; $j<10; $j++) {
if($A[$i]==$A[$j]) break(2);
}
}
if ($i<10) echo "W tablicy \$A znaleziono pasujce elementy!";

W powyszym przykadzie wyraenie break przerywa zarwno drug, jak i pierwsz


ptl, poniewa jego parametr ma warto 2.
Opisywan tutaj funkcj wprowadzono po raz pierwszy w czwartej wersji PHP. Autor
niniejszej ksiki przyznaje, e nigdy dotd nie pracowa z jzykiem o tak przejrzystej skadni podzikowania dla twrcw PHP.

Wyraenie break przydaje si zwaszcza wtedy, gdy trzeba co wyszuka. W momencie


spenienia warunku wyszukiwania przez ktrkolwiek z iteracji nastpuje przerwanie wykonywania ptli. Oto przykad ptli wyszukujcej pierwszy zerowy element w tablicy $A:
for($i=0; $i<count($A); $i++)
if($A[$i]==0) break;
if ($i<count($A)) echo "Znaleziono element zerowy: i=$i";

Nowoci jest tutaj standardowa funkcja count(); zwraca ona liczb elementw w tablicy.
Kolejne wyraenie, continue, ma pewn cech wspln z wyraeniem break moe by
uywane tylko w kombinacji z ptl. Jego zadanie polega na natychmiastowym zakoczeniu biecej iteracji i wykonaniu kolejnej (ale co oczywiste tylko w przypadku

Cz III Podstawy jzyka PHP

162

spenienia warunku postawionego w ptli przedwarunkowej). Kolejne podobiestwo


do wyraenia break polega na moliwoci wskazania poziomu zagniedenia ptli, do
ktrego wykonywane bdzie wyraenie continue.
Jedn z najwaniejszych zalet wyraenia continue jest moliwo znacznego zredukowania liczby klamer, co wpywa na popraw czytelnoci skryptu. Przydaje si to w ptlach
filtrujcych, gdzie wybiera si wycznie obiekty cile odpowiadajce okrelonym
warunkom. Oto przykad ptli, ktra przypisuje zera do elementw tablicy speniajcych
specyficzne warunki:
for($i=0; $i<count($A); $i++) {
if(!warunek1($A[$i])) continue;
...
if(!warunekN($A[$i])) continue;
$A[$i]=0;
}

Poprawne korzystanie z wyrae break oraz continue moe pozytywnie wpyn na


czytelno skryptu, zmniejszajc przy okazji ogln liczb blokw else. Oczywicie
przedstawione tutaj przykady ich uycia nie s najwyszych lotw, ale pozwalaj
si zorientowa, e prdzej czy pniej kady programista dojdzie do wniosku, e
nie potrafi si bez nich obej.

Niezwyke zastosowania wyrae


do-while oraz break
Stosowanie wyraenia break daje ciekawy efekt uboczny, przydatny zwaszcza wwczas,
gdy trzeba omin w skrypcie niepotrzebne elementy (nawiasem mwic, efekt ten
da si rwnie wykorzysta w jzyku C). Taka potrzeba omijania zdarza si zadziwiajco czsto. Rozwamy nastpujcy przykad (listing 9.2).
Listing 9.2. Przykadowy skrypt do przetwarzania formularzy
...
$WasError=0; // Wskanik bdu: warto inna ni zero oznacza bd
// Gdy zostanie kliknity przycisk potwierdzenia (o nazwie $doSubmit)...
if(@$doSubmit) do {
// Sprawdzanie danych wejciowych
if(nieprawidowa_nazwa_uytkownika) { $WasError=1; break; }
...
if(nieprawidowe_dane) { $WasError=1; break; }
...
// Dane s prawidowe, przetwrz je
wykonaj dziaania;
wywietl rezultaty;
zakocz skrypt;
} while(0);
...
// Wywietl formularz, z ktrego uytkownik skorzysta w celu uruchomienia skryptu.
// Moliwe, e naley wywietli komunikat o bdzie, jeli $WasError!=0

Rozdzia 9. Konstrukcje skadniowe jzyka PHP

163

Jest to typowy sposb pisania skryptw dialogowych. Skrypt uruchamiany jest bez
adnych parametrw i uytkownik widzi formularz pytajcy o jego imi, haso i inne tego
typu informacje. Po klikniciu przycisku nastpuje wykonanie operacji zaprogramowanych w skrypcie. Polegaj one na sprawdzeniu, czy kliknito przycisk doSubmit,
a take czy podano nazw i haso. Jeli dane te s nieprawidowe, formularz wywietlany jest ponownie (z komunikatem o bdzie podwietlonym na czerwono). Gdy za
wszystko jest w porzdku, skrypt koczy swoje dziaanie i wywietla rezultaty.
Jak wida, przedstawion tutaj logik do atwo zaadaptowa do konkretnej sytuacji,
o ile tylko znamy metod przerywania wykonywania bloku sprawdzajcego i ponownego wywietlania formularza. Osigamy to przez uycie konstrukcji:
if(warunek) do {...} while(0);

Oczywicie ptla do-while wykonywana jest tylko raz, jako e jej warunek jest zawsze
faszywy. Takiej zwyrodniaej ptli mona jednak uy w sytuacji, gdy zajdzie potrzeba
zakoczenia jej wyraeniem break.
Niektrzy Czytelnicy mog w tym momencie stwierdzi, e w podobnych przypadkach bardziej odpowiednie byoby uycie funkcji i wyraenia return, lecz to jest wanie przykad sytuacji, w ktrej korzystanie z funkcji nie jest zbyt wygodne. Chodzi
o to, e aby pozyska zmienn globaln (w rodzaju elementu formularza) z funkcji,
trzeba wykona dodatkowe operacje. Jest to oczywicie wad PHP i wkrtce przedyskutujemy j szerzej.

Ptla foreach
Ten rodzaj ptli zaprojektowano specjalnie z myl o przegldaniu poszczeglnych
elementw tablicy. Ma ona nastpujc skadni:
foreach(tablica as $klucz=>$warto)
wyraenia;

W powyszym przypadku wyraenia s wykonywane kolejno dla kadego elementu


tablicy, a bieca para klucz=>warto przypisywana jest do zmiennych $klucz oraz
$warto. Rozwamy teraz inny przykad (listing 9.3), w ktrym do wywietlenia
wszystkich zmiennych globalnych posugujemy si konstrukcj foreach.
Listing 9.3. Wywietlanie zmiennych globalnych
<?
foreach($GLOBALS as $k=>$v)
echo "<b>$k</b> => <tt>$v</tt><br>\n";
?>

Ptla foreach ma skadni alternatywn, przydatn zwaszcza wtedy, gdy nie potrzebujemy wartoci klucza biecego elementu. Ten alternatywny format zapisu przedstawia si nastpujco:

Cz III Podstawy jzyka PHP

164
foreach(tablica as $warto)
wyraenia;

W tym przypadku dostpna jest wycznie warto elementu, natomiast klucz nie.
Jest to uyteczne rozwizanie, na przykad, podczas pracy z tablicami list.
Ptla foreach nie korzysta z prawdziwej tablicy, lecz z jej kopii. Oznacza to, e wszelkie zmiany wprowadzone w tablicy nie bd odzwierciedlane w ptli. Mona jednak
uy rezultatu wykonania funkcji jako tablicy. W takim wypadku funkcj wywouje si
tylko raz, przed rozpoczciem ptli, a wszelkie nastpujce pniej manipulacje s
ju wykonywane na kopii zwrconej wartoci.

W nastpnym rozdziale przyjrzymy si nieco uwaniej zagadnieniom dotyczcym tablic


asocjacyjnych.

Struktura kontrolna switch-case


W wielu wypadkach wygodniej jest posuy si specjaln konstrukcj switch-case
w miejsce rozbudowanych wyrae if-else:
switch(wyraenie) {
case warto1: wyraenia1; [break;]
case warto2: wyraenia2; [break;]
...
case wartoN: wyraeniaN; [break;]
[default: domylne_wyraenia; [break;]]
}

Konstrukcja switch-case dziaa w sposb nastpujcy: najpierw szacowana jest warto


wyraenia (zamy, e jest to warto V), a nastpnie wyszukiwana jest linia rozpoczynajca si od case V:. Po jej odnalezieniu wykonywane s kolejne wyraenia (w tym
czasie wszystkie pojawiajce si dalej wyraenia typu case s ignorowane, w przeciwiestwie do pozostaych fragmentw kodu). Gdy podana linia nie zostanie odnaleziona,
wykonywane s wyraenia pojawiajce si po wyraeniu default (o ile jakie istniej).
Zwrmy uwag na obecno wyrae break (zapisano je w nawiasach, co oznacza, e
s opcjonalne). Wstawia si je po kadej grupie wyrae (wyraenia1, wyraenia2 itd.)
z wyjtkiem ostatniej dodanie wyraenia break poniej ostatniej linii jest moliwe,
ale nie ma wikszego sensu. W przypadku zaistnienia warunku V=warto1 mog by
wykonane wszystkie wyraenia, a nie tylko te z grupy pierwszej (wyraenia1).
Skadnia alternatywna dla konstrukcji switch-case prezentuje si nastpujco:
switch(wyraenie):
case warto1: wyraenia1; [break;]
...
case wartoN: wyraeniaN; [break;]
[default: domylne_wyraenia; [break;]]
endswitch;

Rozdzia 9. Konstrukcje skadniowe jzyka PHP

165

Wyraenie require
Wyraenie require umoliwia dokonanie podziau tekstu skryptu na czci, z ktrych
kada tworzy oddzielny plik. Skadnia wyraenia wyglda nastpujco:
require nazwa_pliku;

Rozpoczynajc prac (ale nie wykonanie programu!), interpreter zastpuje wyraenie


plikiem o nazwie nazwa_pliku (moe to by plik zawierajcy skrypt PHP ograniczony
znacznikami <? i ?>). Co w tym wszystkim najwaniejsze, operacja zastpowania wyraenia plikiem wykonywana jest tylko jeden raz (czyli zupenie inaczej ni ma to miejsce
w przypadku wyraenia include opisywanego w dalszej czci rozdziau) przed rozpoczciem wykonywania programu. To bardzo wygodne rozwizanie, szczeglnie gdy
zachodzi potrzeba doczenia do skryptu rnych nagwkw i (lub) stopek HTML.
Przykady znajdziemy na listingach 9.4, 9.5 i 9.6.
Listing 9.4. Plik naglowek.htm
<html>
<head><title>Temat!</title></head>
<body bgcolor=yellow>

Listing 9.5. Plik stopka.htm


&copy;Moja firma, 1999.
</body></html>

Listing 9.6. Plik skrypt.php


<?
require "naglowek.htm";
... skrypt wywietlajcy dokument
require "stopka.htm";
?>

Jest to o wiele lepsze rozwizanie od zwykego przetykania wyrae skryptu fragmentami


kodu HTML. Umoliwia, na przykad, wygodn zmian wygldu strony osobom, ktre
korzystaj z usug naszego programu. Z drugiej strony, nie jest to programowanie w dobrym stylu w kocu mamy tu do czynienia z a trzema rnymi plikami! Tymczasem,
jak wspomniano wczeniej, im mniej plikw skada si na cay program, tym atwiej
nim operowa (szczeglnie z punktu widzenia osoby, ktra nie potrafi posugiwa si
PHP, czyli na przykad projektanta graficznego).
Przy okazji lektury rozdziau 30. poznamy technik rozdzielania kodu i szablonw,
ktra bdzie znakomitym lekarstwem na tego typu problemy.

Cz III Podstawy jzyka PHP

166

Wyraenie include
Wyraenie include jest niemal identyczne z wyraeniem require, z jednym wszake
wyjtkiem. Ot doczany plik staje si czci skryptu nie przed jego wykonaniem,
lecz wanie w czasie wykonywania.
Jak to rnica? Ju wyjaniamy. Zamy, e mamy dziesi plikw tekstowych, nazwanych odpowiednio plik0.php, plik1.php, plik2.php i tak dalej, a do plik9.php.
Kady z tych plikw zawiera cyfr z zakresu od 0 do 9. Uruchamiamy wic nastpujcy program:
for($i=0; $i<10; $i++) {
include "plik$i.php";
}

i w rezultacie jego wykonania otrzymujemy zestaw dziesiciu cyfr: "0123456789". Wida


z tego, e podczas wykonywania ptli kady z plikw tekstowych zosta jednokrotnie
doczony do skryptu (sprbujmy teraz zastpi wyraenie include wyraeniem require,
a nastpnie porwnajmy rezultaty).
By moe Czytelnik zwrci uwag na to, e klamry wydaj si tu zbdne. Ale to pozory.
Gdy tylko je usuniemy, zgoszony zostanie dziwny komunikat o bdzie (lub, co gorsza,
program zacznie funkcjonowa nieprawidowo bez adnej widocznej przyczyny). Dlaczego
tak si dzieje? Poniewa wyraenie include nie jest bynajmniej wyraeniem sensu stricte.
Aby to zrozumie, wyobramy sobie, e za kadym razem, gdy interpreter napotka wyraenie include, po prostu docza do skryptu zawarto odpowiedniego pliku. Lecz co si
stanie, jeli w plik bdzie zawiera wicej ni jedno wyraenie? Tylko pierwsze z nich
zostanie wykonane podczas odtwarzania ptli, natomiast pozostae zostan uwzgldnione dopiero po zakoczeniu ptli. Regua jest zatem taka: jeli tylko uywamy wyraenia include w obrbie inne konstrukcji, to powinnimy otoczy je klamrami.
Istnieje moliwo, e w nowszych wersjach PHP sytuacja ulegnie poprawie, ale raczej
trudno uzna to za pewnik.

Translacja i problemy
z uyciem wyraenia include
Jak ju wiemy, skrypt PHP jest przed wykonaniem przeksztacany na jego wewntrzn
reprezentacj. Po zakoczeniu tego procesu w pamici komputera znajduje si ju na
wp upieczony program, bez komentarzy, niektrych nazw zmiennych, formatowania itd. Potem nastpuje interpretacja, czyli wykonanie tej wewntrznej reprezentacji
skryptu. Wiemy jednak, e mog istnie takie fragmenty programu, ktrych nie da si
podda translacji z wyprzedzeniem jest ona wykonywana pniej, gdy interpreter
napotka takie fragmenty podczas wykonywania skryptu.

Rozdzia 9. Konstrukcje skadniowe jzyka PHP

167

Jednym z takich trudnych fragmentw kodu jest wyraenie include. Gdy tylko interpreter napotka je w skrypcie, zatrzymuje jego wykonanie i wywouje translator, ktrego
zadaniem jest przetworzenie zawartoci doczanego pliku. Zmniejsza to szybko dziaania programu, szczeglnie gdy mamy do czynienia z naprawd duym plikiem. Wniosek
z tego taki, e gdy pracujemy nad rozlegym i bardzo zoonym skryptem, powinnimy unika wyraenia include, zastpujc je gdzie to tylko moliwe wyraeniem
require.
Powysza rada zyskuje na znaczeniu, jako e mamy w perspektywie moliwo pojawienia si ktrego dnia kompilatora PHP. Cechowaby si on zdolnoci przechowywania przetumaczonego kodu w plikach wykonawczych (tak jak ma to miejsce
w programach tworzonych w jzyku Perl). Wwczas uycie wyraenia include powodowaoby zamieszanie, bo kompilator nie wiedziaby, gdzie szuka danych plikw
i ostatecznie nie mogyby one trafi do plikw wykonawczych.
Ktre z wyrae jest zatem lepsze: require czy include? Gdy jestemy pewni, e dany
plik powinien by doczony tylko raz i w jednym konkretnym miejscu, skorzystajmy
z wyraenia require. W innym wypadku korzystniejsze moe by uycie wyraenia
include.

Wyraenia typu _once


Wyrae include i require uywa si najczciej w rozlegych i zoonych skryptach.
Z tego wzgldu odnajdywanie wszystkich miejsc wstawienia tego samego pliku moe
sprawia nie lada trudnoci (nie wspominajc ju o wynikajcych z tego bdach).
eby mie lepsze wyobraenie na temat problemu, z ktrym mamy do czynienia, rozwaymy tak oto histori. Pewnego dnia programista Grzegorz napisa kilka uytecznych
funkcji do obsugi plikw programu Excel. Nastpnie podj decyzj, e zintegruje je
z bibliotek o nazwie xllib.php (listing 9.7).
Listing 9.7. Biblioteka xllib.php
<?
function LoadXlDocument($filename) {...}
function SaveXlDocument($filename,$doc) {...}
?>

Programista Antek postanowi stworzy podobne funkcje dla programu Word, co zaowocowao powstaniem kolejnej biblioteki, o nazwie wlib.php. Poniewa programy Excel
i Word maj ze sob wiele wsplnego, Antek postanowi skorzysta z biblioteki
xllib.php, odwoujc si do niej za pomoc wyraenia require (listing 9.8).
Nie mino wiele czasu i obydwie biblioteki zyskay sobie tak popularno, e zaczli
z nich korzysta inni programici tworzcy na potrzeby sieci. Przy tym nikt nie zawraca sobie gowy konstrukcj bibliotek; po prostu doczali je do skryptw za pomoc
wyraenia require.

Cz III Podstawy jzyka PHP

168
Listing 9.8. Biblioteka wlib.php
<?
require "xllib.php";
function LoadWDocument($filename) {...}
function SaveWDocument($filename,$doc) {...}
?>

Pewnego piknego dnia, bliej nikomu nieznany programista postanowi popracowa


zarwno z dokumentami Excela, jak i Worda. Nie namylajc si wiele, doczy do
skryptu obydwie biblioteki (listing 9.9).
Listing 9.9. Doczanie bibliotek xllib.php i wlib.php
<?
require "wlib.php";
require "xllib.php";
$wd=LoadWDocument("dokument.doc");
$xd=LoadXlDocument("dokument.xls");
?>

Wyobramy sobie zdziwienie na twarzy tego programisty, gdy po uruchomieniu skryptu


jego oczom ukaza si komunikat o bdzie. Komunikat ten gosi, e funkcja LoadXlDocument() w pliku xllib.php zostaa zdefiniowana wicej ni raz!
W czym tkwi problem? atwo to ustali, gdy przeledzi si sposb, w jaki translator
PHP tworzy kod z listingu 9.9. Spjrzmy:
//require "wlib.php";
//require "xllib.php";
function LoadXlDocument($filename) {...}
function SaveXlDocument($filename,$doc) {...}
function LoadWDocument($filename) {...}
function SaveWDocument($filename,$doc) {...}
//require "xllib.php";
function LoadXLDocument($filename) {...}
function SaveXLDocument($filename,$doc) {...}
$wd=LoadWDocument("dokument.doc");
$wd=LoadXlDocument("dokument.xls");

Jak wida, plik xllib.php zosta doczony dwukrotnie: najpierw porednio przez
bibliotek wlib.php, a potem ju bezporednio przez sam program. Dlatego wanie
translator zgosi bd, gdy napotka lini oznaczon w powyszym skrypcie pogrubion czcionk.
Oczywicie autor nieszczsnego skryptu mgby wczeniej przeanalizowa plik rdowy biblioteki wlib.php i wwczas na pewno odkryby, e nie powinien dopuci do
dwukrotnego doczenia pliku xllib.php. Nie takiego jednak rozwizania oczekujemy.
Gdy dochodzi do poredniego, zagniedonego doczania plikw, jedynym sposobem na rozwikanie problemu wydaje si modyfikacja bibliotek. Ale tego nie chcemy.
Co wic powinnimy zrobi?

Rozdzia 9. Konstrukcje skadniowe jzyka PHP

169

C, po tak dugim wprowadzeniu (ale chyba nie za dugim?), czas pozna opini twrcw PHP. Ot oferuj oni bardzo eleganckie rozwizanie wszystkich naszych bolczek: wyraenia include_once oraz require_once.
Wyraenie require_once dziaa niemal identycznie jak wyraenie require z jednym
tylko, lecz zasadniczym, wyjtkiem. Gdy okae si, e dany plik zosta ju wczeniej
doczony do skryptu, wyraenie nie robi nic. Oczywicie takie rozwizanie wymaga
od interpretera PHP przechowywania penych nazw wszystkich doczonych plikw.
I tak te si dzieje.
Podobnie rzecz si ma z wyraeniem include_once z t rnic, e dziaa ono w fazie
wykonywania programu, a nie w fazie jego translacji.
Jak ju wspomniano, w PHP dostpna jest wewntrzna tablica, w ktrej przechowywane s pene nazwy wszystkich doczonych plikw. Zawarto tej wanie tablicy
sprawdzana jest przez wyraenia include_once oraz require_once. Co wicej, dodawanie wartoci do tej tablicy jest take realizowane przez wyraenia require i include.
I wanie dlatego po doczeniu pliku do skryptu, na przykad przez wyraenie require,
danie ponownego doczenia tego samego pliku przez wyraenie require_once
jest po prostu ignorowane.

Wyrae z przyrostkiem _once starajmy si uywa wszdzie, gdzie to tylko moliwe,


natomiast unikajmy jak ognia wyrae require oraz include. W ten sposb atwiej
nam bdzie dzieli zoone skrypty na mniejsze i wzgldnie niezalene fragmenty.

You might also like