You are on page 1of 30

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

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

PHP5. Tajniki
programowania
Autorzy: Andi Gutmans,
Stig Saether Bakken, Derick Rethans
Tumaczenie: Daniel Kaczmarek (przedmowa,
rozdz. 1, 811), Radosaw Meryk (rozdz. 1216,
dod. AC), Anna Zawadzka (rozdz. 27)
ISBN: 83-7361-856-2
Tytu oryginau: PHP 5 Power Programming
Format: B5, stron: 728
Odkryj potg najnowszej wersji jzyka PHP
Zaawansowane techniki programowania w PHP5
Wzorce projektowe i stosowanie technologii XML i SOAP
Sposoby poprawy wydajnoci aplikacji
Wsppraca z bazami danych
PHP w cigu ostatnich lat sta si jednym z najpopularniejszych jzykw
programowania wykorzystywanych do tworzenia aplikacji internetowych.
Swj sukces zawdzicza prostocie i ogromnym moliwociom, pozwalajcym na pisanie
rozbudowanych aplikacji, znacznie przekraczajcych funkcjonalnoci zwyke portale
i dynamiczne strony WWW. Najnowsza wersja jzyka PHP, oznaczona numerem 5,
to w peni obiektowy jzyk programowania umoliwiajcy realizacj zoonych
projektw. Posiada mechanizmy obsugi plikw XML i protokou SOAP oraz
poprawione i rozbudowane funkcje do komunikacji z bazami danych.
PHP5. Tajniki programowania to napisany przez wsptwrc jzyka PHP5 oraz
dwch doskonaych programistw przewodnik opisujcy ogromne moliwoci tej
platformy. Autorzy przedstawiaj sposoby wykorzystania PHP5 w projektach
informatycznych o dowolnej skali zoonoci. Omawiaj model obiektowy PHP5,
wzorce projektowe, metody korzystania z plikw XML i technologii SOAP oraz techniki
wsppracy z bazami danych. W ksice znajdziesz take szczegowe omwienie
biblioteki PEAR, obsugi wyjtkw oraz metod optymalizowania wydajnoci aplikacji.
Nowe moliwoci PHP5
Podstawy PHP5 i programowania zorientowanego obiektowo
Stosowanie wzorcw projektowych
Techniki tworzenia aplikacji WWW
Komunikacja z bazami danych, wsppraca z MySQL i SQLite
Obsuga bdw i wyjtkw
Przetwarzanie plikw XML
Instalowanie biblioteki PEAR
Pakiety PEAR
Tworzenie komponentw PEAR
Przenoszenie kodu z PHP4 do wersji PHP5
Projektowanie wydajnych aplikacji
Jeli tworzysz aplikacje WWW, pakiety lub rozszerzenia PHP, w tej ksice znajdziesz
odpowiedzi na wszystkie pytania.

Spis treci
Sowo wstpne ............................................................................... 15
Przedmowa ..................................................................................... 17
Rozdzia 1. Co nowego w PHP5? ...................................................................... 25
1.1. Wprowadzenie ..................................................................................................... 25
1.2. Wasnoci jzyka ................................................................................................. 25
1.2.1. Nowy model zorientowany obiektowo ................................................... 25
1.2.2. Nowe mechanizmy zorientowane obiektowo ......................................... 27
1.2.3. Pozostae nowe mechanizmy jzyka ...................................................... 31
1.3. Oglne zmiany w PHP ......................................................................................... 32
1.3.1. XML i usugi sieciowe ........................................................................... 32
1.4. Pozostae nowe mechanizmy PHP5 ..................................................................... 36
1.4.1. Nowy meneder pamici ........................................................................ 36
1.4.2. Wycofana obsuga Windows 95 ............................................................. 36
1.5. Podsumowanie ..................................................................................................... 36

Rozdzia 2. Podstawy jzyka PHP5 .................................................................... 37


2.1. Wprowadzenie ..................................................................................................... 37
2.2. Osadzanie w HTML ............................................................................................. 38
2.3. Komentarze .......................................................................................................... 38
2.4. Zmienne ............................................................................................................... 39
2.4.1. Porednie referencje do zmiennych ........................................................ 40
2.4.2. Zarzdzanie zmiennymi ......................................................................... 40
2.4.3. Superglobale ........................................................................................... 42
2.5. Podstawowe typy danych ..................................................................................... 43
2.5.1. Liczby cakowite .................................................................................... 43
2.5.2. Liczby zmiennopozycyjne ...................................................................... 43
2.5.3. acuchy ................................................................................................ 44
2.5.4. Typ logiczny (boolowski) ...................................................................... 46
2.5.5. Null ........................................................................................................ 47
2.5.6. Identyfikator zasobw (resource) ........................................................... 48
2.5.7. Tablice .................................................................................................... 48
2.5.8. Stae ....................................................................................................... 54
2.6. Operatory ............................................................................................................. 55
2.6.1. Operatory binarne ................................................................................... 56
2.6.2. Operatory przypisania ............................................................................ 56
2.6.3. Operatory porwnania ............................................................................ 57
2.6.4. Operatory logiczne ................................................................................. 58
2.6.5. Operatory bitowe .................................................................................... 59

PHP5. Tajniki programowania


2.6.6. Operatory jednoargumentowe ................................................................ 59
2.6.7. Operatory negacji ................................................................................... 59
2.6.8. Operatory inkrementacji i dekrementacji ............................................... 60
2.6.9. Operatory rzutowania ............................................................................. 61
2.6.10. Operator kontroli bdw ....................................................................... 61
2.6.11. Jedyny operator trjargumentowy (tzw. ternariusz) ............................... 62
2.7. Struktury kontrolne .............................................................................................. 62
2.7.1. Warunkowe struktury kontrolne ............................................................. 62
2.7.2. Struktury kontrolne w postaci ptli ........................................................ 65
2.7.3. Struktury kontrolne doczania kodu ...................................................... 68
2.8. Funkcje ................................................................................................................ 70
2.8.1. Funkcje definiowane przez uytkownika ............................................... 71
2.8.2. Zasig funkcji ......................................................................................... 71
2.8.3. Zwracanie wartoci przez warto .......................................................... 72
2.8.4. Zwracanie wartoci przez referencj ...................................................... 73
2.8.5. Definiowanie parametrw funkcji .......................................................... 73
2.8.6. Zmienne statyczne .................................................................................. 75
2.9. Podsumowanie ..................................................................................................... 75

Rozdzia 3. Jzyk obiektowy ............................................................................. 77


3.1. Wprowadzenie ..................................................................................................... 77
3.2. Obiekty ................................................................................................................ 78
3.3. Deklarowanie klasy .............................................................................................. 79
3.4. Sowo kluczowe new i konstruktory .................................................................... 79
3.5. Destruktory .......................................................................................................... 80
3.6. Odwoywanie si do metod i waciwoci przy uyciu zmiennej $this ................ 81
3.6.1. Waciwoci public, protected i private .................................................. 81
3.6.2. Metody public, protected i private .......................................................... 83
3.6.3. Waciwoci statyczne ............................................................................ 84
3.6.4. Metody statyczne ................................................................................... 86
3.7. Stae klasy ............................................................................................................ 86
3.8. Klonowanie obiektw .......................................................................................... 87
3.9. Polimorfizm ......................................................................................................... 89
3.10. parent:: i self:: ...................................................................................................... 91
3.11. Operator instanceof .............................................................................................. 92
3.12. Metody i klasy abstrakcyjne ................................................................................ 93
3.13. Interfejsy .............................................................................................................. 94
3.14. Dziedziczenie interfejsw .................................................................................... 96
3.15. Metody final ........................................................................................................ 96
3.16. Klasy final ............................................................................................................ 97
3.17. Metoda __toString() ............................................................................................. 97
3.18. Obsuga wyjtkw ............................................................................................... 98
3.19. __autoload() ....................................................................................................... 101
3.20. Wskazania typu klasy w parametrach funkcji .................................................... 103
3.21. Podsumowanie ................................................................................................... 104

Rozdzia 4. Zaawansowane programowanie obiektowe i wzorce projektowe ...... 105


4.1. Wprowadzenie ................................................................................................... 105
4.2. Moliwoci przeciania .................................................................................... 105
4.2.1. Przecianie waciwoci i metod ........................................................ 106
4.2.2. Przecianie skadni dostpu do tablic ................................................. 108
4.3. Iteratory ............................................................................................................. 109
4.4. Wzorce projektowe ............................................................................................ 113
4.4.1. Wzorzec strategii .................................................................................. 114
4.4.2. Wzorzec Singleton ............................................................................... 116

Spis treci

7
4.4.3. Wzorzec fabryki ................................................................................... 117
4.4.4. Wzorzec obserwatora ........................................................................... 120
4.5. Refleksja (ang. reflection) .................................................................................. 122
4.5.1. Wprowadzenie ...................................................................................... 122
4.5.2. Interfejs Reflector ................................................................................. 123
4.5.3. Przykady uycia refleksji .................................................................... 125
4.5.4. Implementowanie wzorca delegata przy uyciu refleksji ..................... 126
4.6. Podsumowanie ................................................................................................... 128

Rozdzia 5. Jak napisa aplikacj sieci WWW z PHP ........................................ 129


5.1. Wprowadzenie ................................................................................................... 129
5.2. Osadzanie w kodzie HTML ............................................................................... 130
5.3. Dane wprowadzane przez uytkownika ............................................................. 132
5.4. Zabezpieczanie danych wprowadzanych przez uytkownika .............................. 134
5.4.1. Pospolite bdy ..................................................................................... 135
5.5. Techniki zabezpieczania skryptw .................................................................... 137
5.5.1. Sprawdzanie danych wejciowych ....................................................... 137
5.5.2. Weryfikacja HMAC ............................................................................. 139
5.5.3. PEAR::Crypt_HMAC .......................................................................... 140
5.5.4. Program filtrujcy ................................................................................ 143
5.5.5. Praca z hasami ..................................................................................... 144
5.5.6. Obsuga bdw .................................................................................... 145
5.6. Cookies .............................................................................................................. 146
5.7. Sesje ................................................................................................................... 149
5.8. Wgrywanie plikw (ang. upload) ...................................................................... 153
5.8.1. Obsugiwanie przychodzcego wgrywanego pliku .............................. 153
5.9. Architektura ....................................................................................................... 158
5.9.1. Jeden skrypt obsuguje wszystko .......................................................... 158
5.9.2. Jeden skrypt na funkcj ........................................................................ 159
5.9.3. Oddzielanie logiki od ukadu ............................................................... 159
5.10. Podsumowanie ................................................................................................... 161

Rozdzia 6. Bazy danych z PHP5 ..................................................................... 163


6.1. Wprowadzenie ................................................................................................... 163
6.2. MySQL .............................................................................................................. 164
6.2.1. Mocne i sabe strony MySQL ............................................................... 164
6.2.2. Interfejs PHP ........................................................................................ 165
6.2.3. Przykadowe dane ................................................................................ 166
6.2.4. Poczenia ............................................................................................ 166
6.2.5. Zapytania buforowane i niebuforowane ............................................... 168
6.2.6. Zapytania .............................................................................................. 168
6.2.7. Zapytania z wieloma instrukcjami ........................................................ 169
6.2.8. Tryby pobierania .................................................................................. 170
6.2.9. Zapytania preinterpretowane ................................................................ 170
6.2.10. Obsuga BLOB ..................................................................................... 173
6.3. SQLite ................................................................................................................ 174
6.3.1. Mocne i sabe strony SQLite ................................................................ 174
6.3.2. Najlepsze obszary zastosowania ........................................................... 176
6.3.3. Interfejs PHP ........................................................................................ 176
6.4. PEAR DB .......................................................................................................... 191
6.4.1. Uzyskiwanie PEAR BD ....................................................................... 191
6.4.2. Wady i zalety abstrakcji baz danych .................................................... 191
6.4.3. Ktre funkcje s abstrahowane ............................................................. 192
6.4.4. Poczenia z baz danych ..................................................................... 193

PHP5. Tajniki programowania


6.4.5. Wykonywanie zapyta ......................................................................... 195
6.4.6. Pobieranie wynikw ............................................................................. 198
6.4.7. Sekwencje ............................................................................................ 200
6.4.8. Funkcje zwizane z przenonoci ....................................................... 201
6.4.9. Bdy abstrakcyjne ............................................................................... 203
6.4.10. Metody zoone .................................................................................... 205
6.5. Podsumowanie ................................................................................................... 207

Rozdzia 7. Obsuga bdw ............................................................................ 209


7.1. Wprowadzenie ................................................................................................... 209
7.2. Rodzaje bdw ................................................................................................. 210
7.2.1. Bdy programistyczne ......................................................................... 210
7.2.2. Niezdefiniowane symbole .................................................................... 213
7.2.3. Bdy dotyczce przenonoci .............................................................. 215
7.2.4. Bdy wykonania .................................................................................. 219
7.2.5. Bdy PHP ............................................................................................ 219
7.3. Bdy PEAR ...................................................................................................... 225
7.3.1. Klasa PEAR_Error ............................................................................... 228
7.3.2. Obsuga bdw PEAR ......................................................................... 231
7.3.3. Tryby bdw PEAR ............................................................................ 232
7.3.4. agodna obsuga bdw ...................................................................... 233
7.4. Wyjtki .............................................................................................................. 235
7.4.1. Co to s wyjtki .................................................................................... 235
7.4.2. try, catch i throw .................................................................................. 236
7.5. Podsumowanie ................................................................................................... 238

Rozdzia 8. XML i PHP5 .................................................................................. 239


8.1. Wprowadzenie ................................................................................................... 239
8.2. Sownictwo ........................................................................................................ 240
8.3. Parsowanie XML-a ............................................................................................ 242
8.3.1. SAX ..................................................................................................... 242
8.3.2. DOM .................................................................................................... 246
8.4. SimpleXML ....................................................................................................... 250
8.4.1. Tworzenie obiektu SimpleXML ........................................................... 251
8.4.2. Przegldanie obiektw SimpleXML .................................................... 251
8.4.3. Zapisywanie obiektw SimpleXML ..................................................... 253
8.5. PEAR ................................................................................................................. 253
8.5.1. XML_Tree ........................................................................................... 253
8.5.2. XML_RSS ............................................................................................ 254
8.6. Przeksztacanie XML-a ...................................................................................... 257
8.6.1. XSLT .................................................................................................... 257
8.7. Komunikacja za porednictwem XML .............................................................. 261
8.7.1. XML-RPC ............................................................................................ 262
8.7.2. SOAP ................................................................................................... 269
8.8. Podsumowanie ................................................................................................... 275

Rozdzia 9. Najwaniejsze rozszerzenia ............................................................ 277


9.1. Wprowadzenie ................................................................................................... 277
9.2. Pliki i strumienie ................................................................................................ 278
9.2.1. Dostp do plikw ................................................................................. 278
9.2.2. Dane wejciowe i wyjciowe z programu ............................................ 280
9.2.3. Strumienie wejcia/wyjcia .................................................................. 283
9.2.4. Strumienie kompresji ........................................................................... 284
9.2.5. Strumienie uytkownika ....................................................................... 286
9.2.6. Strumienie URL ................................................................................... 288

Spis treci

9
9.2.7. Blokowanie .......................................................................................... 292
9.2.8. Zmiana nazwy i usuwanie plikw ........................................................ 293
9.2.9. Pliki tymczasowe ................................................................................. 294
9.3. Wyraenia regularne .......................................................................................... 295
9.3.1. Skadnia ................................................................................................ 295
9.3.2. Funkcje ................................................................................................. 308
9.4. Obsuga dat ........................................................................................................ 315
9.4.1. Odczytywanie daty i godziny ............................................................... 315
9.4.2. Formatowanie daty i godziny ............................................................... 318
9.4.3. Parsowanie dat w rnych formatach ................................................... 326
9.5. Operacje na grafice przy uyciu GD .................................................................. 326
9.5.1. Przypadek 1: formularz odporny na dziaanie robotw ........................ 328
9.5.2. Przypadek 2: wykres supkowy ............................................................ 333
9.5.3. Rozszerzenie Exif ................................................................................. 338
9.6. Wielobajtowe cigi i zestawy znakw ............................................................... 340
9.6.1. Konwersje zestaww znakw ............................................................... 341
9.6.2. Dodatkowe funkcje obsugujce zestawy znakw wielobajtowych ..... 346
9.6.3. Ustawienia midzynarodowe ................................................................ 350
9.7. Podsumowanie ................................................................................................... 353

Rozdzia 10. Stosowanie PEAR ......................................................................... 355


10.1. Wprowadzenie ................................................................................................... 355
10.2. Pojcia zwizane z PEAR .................................................................................. 356
10.2.1. Pakiety ................................................................................................. 356
10.2.2. Wersje .................................................................................................. 357
10.2.3. Numery wersji ...................................................................................... 358
10.3. Pobieranie repozytorium PEAR ......................................................................... 360
10.3.1. Instalowanie dystrybucji PHP PEAR dla systemw UNIX/Linux ....... 360
10.3.2. Windows .............................................................................................. 361
10.3.3. go-pear.org ........................................................................................... 362
10.4. Instalowanie pakietw ....................................................................................... 365
10.4.1. Polecenie pear ...................................................................................... 366
10.5. Parametry konfiguracyjne .................................................................................. 369
10.6. Polecenia PEAR ................................................................................................. 376
10.6.1. Polecenie pear install ........................................................................... 376
10.6.2. Polecenie pear list ................................................................................ 380
10.6.3. Polecenie pear info ............................................................................... 381
10.6.4. Polecenie pear list-all ........................................................................... 382
10.6.5. Polecenie pear list-upgrades ................................................................. 382
10.6.6. Polecenie pear upgrade ........................................................................ 383
10.6.7. Polecenie pear upgrade-all ................................................................... 384
10.6.8. Polecenie pear uninstall ........................................................................ 385
10.6.9. Polecenie pear search ........................................................................... 385
10.6.10. Polecenie pear remote-list .................................................................... 386
10.6.11. Polecenie pear remote-info .................................................................. 387
10.6.12. Polecenie pear download ..................................................................... 387
10.6.13. Polecenie pear config-get ..................................................................... 388
10.6.14. Polecenie pear config-set ..................................................................... 388
10.6.15. Polecenie pear config-show ................................................................. 388
10.6.16. Skrty ................................................................................................... 389
10.7. Interfejsy instalatora .......................................................................................... 390
10.7.1. Instalator CLI (Command Line Interface) ............................................ 390
10.7.2. Instalator Gtk ....................................................................................... 390
10.8. Podsumowanie ................................................................................................... 393

10

PHP5. Tajniki programowania

Rozdzia 11. Najwaniejsze pakiety PEAR ......................................................... 395


11.1. Wprowadzenie ................................................................................................... 395
11.2. Zapytania do bazy danych ................................................................................. 395
11.3. Systemy szablonw ........................................................................................... 395
11.3.1. Pojcia zwizane z szablonami ............................................................ 396
11.3.2. Szablon HTML_Template_IT .............................................................. 396
11.3.3. Szablon HTML_Template_Flexy ......................................................... 399
11.4. Uwierzytelnianie ................................................................................................ 404
11.4.1. Informacje oglne ................................................................................ 404
11.4.2. Przykad: Auth i plik z hasami ............................................................ 405
11.4.3. Przykad: Auth i baza danych z danymi o uytkowniku ...................... 406
11.4.4. Bezpieczestwo pracy z pakietem Auth ............................................... 408
11.4.5. Skalowalno Auth .............................................................................. 410
11.4.6. Podsumowanie informacji o Auth ........................................................ 411
11.5. Obsuga formularzy ........................................................................................... 411
11.5.1. Pakiet HTML_QuickForm ................................................................... 411
11.5.2. Przykad: formularz logowania ............................................................ 412
11.5.3. Pobieranie danych ................................................................................ 412
11.6. Buforowanie ...................................................................................................... 412
11.6.1. Pakiet Cache_Lite ................................................................................ 413
11.7. Podsumowanie ................................................................................................... 414

Rozdzia 12. Tworzenie komponentw PEAR ..................................................... 415


12.1. Wprowadzenie ................................................................................................... 415
12.2. Standardy PEAR ................................................................................................ 415
12.2.1. Nazewnictwo symboli .......................................................................... 416
12.2.2. Wcicia ................................................................................................ 418
12.3. Numery wersji ................................................................................................... 420
12.4. rodowisko wiersza polecenia ........................................................................... 421
12.5. Podstawy ............................................................................................................ 422
12.5.1. Kiedy i w jaki sposb mona docza pliki ........................................ 422
12.5.2. Obsuga bdw .................................................................................... 423
12.6. Tworzenie pakietw ........................................................................................... 423
12.6.1. Przykad PEAR: HelloWorld ............................................................... 424
12.6.2. Tworzenie archiwum tarball ................................................................. 426
12.6.3. Weryfikacja .......................................................................................... 427
12.6.4. Testy regresji ........................................................................................ 428
12.7. Format pliku package.xml ................................................................................. 428
12.7.1. Informacje o pakiecie ........................................................................... 429
12.7.2. Informacje o wersji .............................................................................. 431
12.8. Zalenoci .......................................................................................................... 436
12.8.1. Element <deps> ................................................................................... 436
12.8.2. Element <dep> ..................................................................................... 436
12.8.3. Typy zalenoci .................................................................................... 437
12.8.4. Dlaczego naley unika zalenoci ...................................................... 438
12.8.5. Zalenoci opcjonalne .......................................................................... 439
12.8.6. Przykady ............................................................................................. 439
12.9. Zastpowanie cigw znakw ........................................................................... 440
12.9.1. Element <replace> ............................................................................... 440
12.9.2. Przykady ............................................................................................. 440
12.10. Wczanie kodu w jzyku C .............................................................................. 441
12.10.1. Element <configureoptions> ................................................................ 441
12.10.2. Element <configureoption> ................................................................. 441

Spis treci

11
12.11. Publikowanie pakietw ...................................................................................... 442
12.12. Proces publikowania pakietw PEAR ............................................................... 442
12.13. Przygotowanie pakietu ...................................................................................... 444
12.13.1. Analiza kodu rdowego .................................................................... 444
12.13.2. Generowanie sum kontrolnych MD5 ................................................... 444
12.13.3. Aktualizacja pliku package.xml ........................................................... 444
12.13.4. Tworzenie archiwum tarball ................................................................ 445
12.14. Przesyanie kodu ................................................................................................ 445
12.14.1. Przesyanie wydania ............................................................................. 445
12.14.2. Koniec .................................................................................................. 446
12.15. Podsumowanie ................................................................................................... 446

Rozdzia 13. Migracja ...................................................................................... 447


13.1. Wprowadzenie ................................................................................................... 447
13.2. Model obiektowy ............................................................................................... 447
13.3. Przekazywanie obiektw do funkcji .................................................................. 448
13.4. Tryb zgodnoci .................................................................................................. 449
13.4.1. Konwersja obiektw .............................................................................. 449
13.4.2. Porwnywanie obiektw ........................................................................ 450
13.5. Inne zmiany ....................................................................................................... 451
13.5.1. Przypisywanie wartoci do zmiennej $this ............................................ 451
13.5.2. get_class ................................................................................................. 454
13.6. E_STRICT ......................................................................................................... 454
13.6.1. Automagiczne tworzenie obiektw .................................................... 454
13.6.2. var i public ............................................................................................. 455
13.6.3. Konstruktory .......................................................................................... 455
13.6.4. Metody dziedziczone ............................................................................. 456
13.6.5. Definiowanie klas przed ich wykorzystaniem ........................................ 456
13.7. Inne problemy zgodnoci ................................................................................... 456
13.7.1. Interfejs wiersza polecenia ..................................................................... 457
13.7.2. Komentarze ............................................................................................ 457
13.7.3. MySQL .................................................................................................. 458
13.8. Zmiany w funkcjach .......................................................................................... 458
13.8.1. array_merge() ......................................................................................... 459
13.8.2. strrpos() i strripos() ................................................................................ 459
13.9. Podsumowanie ................................................................................................... 460

Rozdzia 14. Wydajno ................................................................................... 461


14.1. Wprowadzenie ................................................................................................... 461
14.2. Projektowanie wydajnych aplikacji ................................................................... 462
14.2.1. Wskazwka 1: uwaga na stany ............................................................... 462
14.2.2. Wskazwka 2: buforowanie ................................................................... 463
14.2.3. Wskazwka 3: nie naley przesadza z projektowaniem ....................... 469
14.3. Testy szybkoci .................................................................................................. 470
14.3.1. Zastosowanie programu ApacheBench .................................................. 470
14.3.2. Zastosowanie programu Siege ............................................................... 471
14.3.3. Testowanie a rzeczywisty ruch .............................................................. 472
14.4. Tworzenie profilu aplikacji za pomoc programu Profiler z pakietu Zend Studio .....472
14.5. Tworzenie profili za pomoc APD .................................................................... 473
14.5.1. Instalacja debugera APD ........................................................................ 474
14.5.2. Analiza danych ....................................................................................... 475
14.6. Tworzenie profili za pomoc programu Xdebug ............................................... 478
14.6.1. Instalacja programu Xdebug .................................................................. 478
14.6.2. ledzenie wykonywania skryptu ............................................................ 479
14.6.3. Zastosowanie programu KCachegrind ................................................... 481

12

PHP5. Tajniki programowania


14.7. Zastosowanie APC (Advanced PHP Cache) ...................................................... 483
14.8. Zastosowanie ZPS (Zend Performance Suite) ................................................... 484
14.8.1. Automatyczna optymalizacja ................................................................. 484
14.8.2. Buforowanie skompilowanego kodu ...................................................... 485
14.8.3. Buforowanie dynamicznych stron .......................................................... 486
14.8.4. Kompresja stron ..................................................................................... 489
14.9. Optymalizacja kodu ........................................................................................... 490
14.9.1. Mikrotesty szybkoci ............................................................................. 491
14.9.2. Przepisywanie kodu w PHP na jzyk C ................................................. 493
14.9.3. Kod obiektowy a proceduralny .............................................................. 493
14.10. Podsumowanie ................................................................................................... 495

Rozdzia 15. Wstp do pisania rozszerze PHP .................................................. 497


15.1. Wprowadzenie ................................................................................................... 497
15.2. Szybki start ........................................................................................................ 498
15.2.1. Zarzdzanie pamici ............................................................................. 503
15.2.2. Zwracanie wartoci z funkcji PHP ......................................................... 504
15.2.3. Dokoczenie funkcji self_concat() ......................................................... 504
15.2.4. Podsumowanie przykadu ...................................................................... 506
15.2.5. Tworzenie interfejsu dla bibliotek zewntrznych ................................... 506
15.2.6. Zmienne globalne ................................................................................... 515
15.2.7. Wprowadzanie wasnych dyrektyw INI ................................................. 515
15.2.8. Makra TSRM (Thread-Safe Resource Manager) ................................... 517
15.3. Podsumowanie ................................................................................................... 518

Rozdzia 16. Tworzenie skryptw powoki w PHP .............................................. 521


16.1. Wprowadzenie ................................................................................................... 521
16.2. Wykorzystanie PHP do pisania skryptw powoki
dziaajcych w wierszu polecenia ...................................................................... 521
16.2.1. Rnice pomidzy wersjami CLI i CGI ................................................. 522
16.2.2. rodowisko wykonywania skryptw powoki ........................................ 524
16.2.3. Przetwarzanie opcji wiersza polecenia ................................................... 526
16.2.4. Dobre praktyki ....................................................................................... 529
16.2.5. Zarzdzanie procesami ........................................................................... 530
16.2.6. Przykady ............................................................................................... 533
16.3. Podsumowanie ................................................................................................... 539

Dodatek A Zestawienie pakietw repozytoriw PEAR i PECL ........................... 541


A.1. Uwierzytelnianie ................................................................................................. 541
A.2. Testy szybkoci ................................................................................................... 545
A.3. Buforowanie ....................................................................................................... 545
A.4. Konfiguracja ....................................................................................................... 546
A.5. Obsuga konsoli .................................................................................................. 547
A.6. Bazy danych ........................................................................................................ 549
A.7. Godziny i daty ..................................................................................................... 560
A.8. Szyfrowanie ........................................................................................................ 562
A.9. Formaty plikw ................................................................................................... 564
A.10. System plikw .................................................................................................... 568
A.11. Elementy obsugi Gtk ......................................................................................... 570
A.12. HTML ................................................................................................................. 571
A.13. HTTP .................................................................................................................. 585
A.14. Pliki graficzne ..................................................................................................... 588
A.15. Obsuga ustawie midzynarodowych ................................................................ 592
A.16. Rejestrowanie ..................................................................................................... 594
A.17. Poczta ................................................................................................................. 595

Spis treci

13
A.18. Operacje matematyczne ...................................................................................... 598
A.19. Obsuga sieci ...................................................................................................... 602
A.20. Liczby ................................................................................................................. 616
A.21. Patnoci ............................................................................................................. 617
A.22. PEAR .................................................................................................................. 619
A.23. PHP .................................................................................................................... 621
A.24. Przetwarzanie danych ......................................................................................... 629
A.25. Obliczenia naukowe ........................................................................................... 629
A.26. Strumienie .......................................................................................................... 630
A.27. Struktury ............................................................................................................. 632
A.28. System ................................................................................................................ 634
A.29. Przetwarzanie tekstu ........................................................................................... 635
A.30. Narzdzia ............................................................................................................ 637
A.31. Serwisy internetowe ........................................................................................... 640
A.32. XML ................................................................................................................... 642

Dodatek B Format pakietu phpDocumentor .................................................... 653


B.1. Wprowadzenie .................................................................................................... 653
B.2. Tworzenie dokumentacji za pomoc komentarzy ............................................... 654
B.3. Znaczniki ............................................................................................................ 655
B.4. Tabela znacznikw .............................................................................................. 670
B.5. Korzystanie z narzdzia phpDocumentor ............................................................ 670

Dodatek C Zend Studio szybki start ........................................................... 679


C.1. Wersja 3.5.x ........................................................................................................ 679
C.2. O podrczniku Zend Studio Client szybki start .............................................. 679
C.3. O firmie Zend ...................................................................................................... 680
C.4. Zend Studio Client: przegld ............................................................................... 680
C.5. Edycja plikw ..................................................................................................... 683
C.6. Projekty ............................................................................................................... 684
C.7. Korzystanie z debugera ....................................................................................... 685
C.8. Konfiguracja pakietu Zend Studio Server w celu debugowania i tworzenia profili .....688
C.9. Korzystanie z programu Profiler ......................................................................... 688
C.10. Obsuga produktu ................................................................................................ 690
C.11. Najwaniejsze wasnoci .................................................................................... 691

Skorowidz ..................................................................................... 693

Rozdzia 3.

Jzyk obiektowy
Wzniose myli wymagaj wzniosego jzyka. Arystofanes

3.1. Wprowadzenie
Obsuga programowania obiektowego zostaa wprowadzona w PHP3. Cho nadawaa
si do pracy, bya niezwykle uproszczona. Niewiele zmienio si pod tym wzgldem
wraz z wydaniem wersji PHP4, gdy w nowej wersji gwny nacisk pooono na
zgodno z poprzednimi. To oglne zapotrzebowanie na ulepszon obsug obiektow spowodowao, e w PHP5 ponownie zaprojektowano cay model obiektowy, dodajc znaczn liczb mechanizmw, a take zmieniajc zachowanie podstawowego
obiektu.
Pocztkujcy uytkownicy PHP dziki lekturze tego rozdziau bd mogli zapozna
si z modelem obiektowym. Jednak zawarte tu informacje bd take uyteczne dla
osb zaznajomionych ju z PHP4, poniewa wraz z wprowadzeniem wersji PHP5
ulego zmianie prawie wszystko, co ma zwizek z programowaniem obiektowym.
Dziki lekturze tego rozdziau czytelnik bdzie mg pozna:
 podstawy modelu obiektowego,
 sposb tworzenia i cykl ycia obiektu oraz metody jego sterowania,
 trzy gwne sowa kluczowe ograniczania dostpu (, 


i 
),
 korzyci pynce z uywania dziedzicznoci klas,
 wskazwki prowadzce do udanej obsugi wyjtkw.

78

PHP5. Tajniki programowania

3.2. Obiekty
Programowanie obiektowe rni si od funkcjonalnego gwnie tym, e dane i kod
wystpuj w nim jako jedna cao, znana pod nazw obiektu. Aplikacje obiektowe
zazwyczaj s podzielone na pewn liczb obiektw, ktre ze sob wspdziaaj.
Kady obiekt zwykle reprezentuje jeden wyodrbniony, niezaleny od innych problem, i ma pewn liczb waciwoci i metod. Waciwoci s danymi obiektu, co zasadniczo oznacza zmienne, ktre nale do obiektu. Metody dla osb przywykych
do pracy w rodowiskach funkcjonalnych s funkcjami, ktre obsuguje obiekt, za
funkcjonalno, ktra wedug przeznaczenia ma by dostpna dla innych obiektw
i wykorzystywana do interakcji z nimi, jest nazywana interfejsem obiektu.
Rysunek 3.1 przedstawia klas. Klasa jest czym w rodzaju szablonu dla obiektu
i opisuje metody i waciwoci, ktre bdzie mia obiekt danego typu. W tym przykadzie klasa reprezentuje osob. Dla kadej osoby w aplikacji mona stworzy oddzielny
egzemplarz tej klasy, reprezentujcy informacje o tej osobie. Jeli na przykad dwie
osoby w naszej aplikacji nosz imiona Jan i Julia, mona utworzy dwa oddzielne egzemplarze tej klasy i dla obu wywoa metod , ktra pozwoli zainicjowa zmienn

, zawierajc imi danej osoby. Metody i skadowe, ktrych mog uywa inne
oddziaujce obiekty, tworz kontrakt klasy. W tym przykadzie kontraktami osoby ze
wiatem zewntrznym s dwie metody  i ,  i .
Rysunek 3.1.
Schemat klasy
Person

Przedstawiony tu przykadowy kod PHP definiuje klas, tworzy jej dwa egzemplarze,
definiuje nazw kadego egzemplarza, po czym wywietla nazwy:


 

    
 


 
 


    



  



Rozdzia 3. Jzyk obiektowy

79






 






 


  
 

  
 


3.3. Deklarowanie klasy


Wnioskujc z prezentowanego przed chwil przykadu mona stwierdzi, e zdefiniowanie klasy (szablonu obiektu) nie jest niczym trudnym. Wystarczy uy sowa
kluczowego  , nada klasie nazw, po czym wymieni wszystkie metody i waciwoci, ktre powinien mie egzemplarz tej klasy:
 !

// Lista metod

// Lista waciwoci



Jak wida, na pocztku definicji waciwoci


 uyte zostao sowo kluczowe

. Zostanie ono omwione szczegowo w dalszej czci ksiki; w tym przypadku oznacza ono, e do
 mog mie dostp tylko metody z tej klasy. Zmusza
to kadego, kto chciaby pobra lub ustawi t waciwo, do posuenia si metodami  i , ktre reprezentuj interfejs klasy przeznaczony do uytku przez inne obiekty lub kod rdowy.

3.4. Sowo kluczowe new


i konstruktory
Egzemplarze klas s tworzone przy uyciu sowa kluczowego 
. W poprzednim
przykadzie nowy egzemplarz klasy  
zosta utworzony przy pomocy instrukcji

  
. Podczas wywoania 
 zostaje przydzielony nowy obiekt,
z wasnymi kopiami waciwoci zdefiniowanymi we wskazanej klasie, po czym
przywoany zostaje konstruktor obiektu, jeli tylko zosta zdefiniowany. Konstruktor
to metoda o nazwie 
 , ktra jest automatycznie przywoywana przez
sowo kluczowe 
 po utworzeniu obiektu. Zazwyczaj suy do automatycznego wykonywania rnych inicjalizacji, takich jak inicjalizacja waciwoci. Konstruktory
mog rwnie pobiera argumenty; w takim przypadku w momencie napisania instrukcji 
 trzeba rwnie przekaza konstruktorowi parametry funkcji, umieszczajc
je midzy nawiasami.

80

PHP5. Tajniki programowania

W PHP4, podobnie jak w C++, zamiast uywa metody 


  jako nazwy
konstruktora, definiowao si metod, nadajc jej tak sam nazw jak ta, ktr posiadaa klasa. W PHP5 moliwo ta wci istnieje, jednak dla nowych aplikacji naley
uywa nowej, zunifikowanej konwencji nazywania konstruktorw.
Nasz poprzedni przykad mona napisa w inny sposb, tak by w wierszu 
 kod
przekazywa imiona osb:

   ""# #  


  
 


    



  



 










  
 

  
 


Wynik zwrcony przez ten kod bdzie identyczny z tym z poprzedniego przykadu.
Poniewa konstruktor nie moe zwraca wartoci, najczstsz praktyk zgaszania
bdu ze rodka konstruktora jest rzucenie wyjtku.

3.5. Destruktory
Destruktory to odwrotno konstruktorw. Wywoywane s one w momencie usuwania obiektu (na przykad gdy do danego obiektu nie ma ju referencji). Poniewa
PHP pilnuje, by po kadym daniu wszystkie zasoby zostay zwolnione, destruktory
maj ograniczone znaczenie. Mimo to wci mog by przydatne do wykonywania
okrelonych czynnoci, takich jak oprnianie zasobu lub informacji o rejestracji
w momencie usuwania obiektu. Destruktor moe by wywoany w dwch sytuacjach:
podczas wykonywania skryptu, kiedy niszczone s wszystkie odwoania do obiektu,
lub w momencie osignicia koca skryptu i zakoczenia wykonywania przez PHP
dania. Druga sytuacja jest do niedogodna, poniewa jest si uzalenionym od
pewnych obiektw, ktrych destruktory mogy ju zosta wywoane, wskutek czego
obiekty te nie s ju dostpne. Std te destruktorw naley uywa ostronie i nie
uzalenia ich od innych obiektw.

Rozdzia 3. Jzyk obiektowy

81

Definiowanie destruktora polega na dodaniu do klasy metody  :


 !

   ""$ # 

 %#%  &'  ( !



&
 !

&)**

W rezultacie skrypt wywietli:


%#%  &'  ( !


W tym przykadzie dojcie do instrukcji  powoduje usunicie jedynego


uchwytu do obiektu, w nastpstwie czego zostaje wywoany destruktor, a sam obiekt
ulega zniszczeniu. Destruktor zostaby wywoany take bez ostatniego wiersza kodu,
tym razem jednak podczas koczenia wykonywania dania.
PHP nie gwarantuje dokadnego czasu wywoania destruktora. Moe to by kilka
instrukcji po wykonaniu ostatniego odwoania do obiektu. Z tego wanie wzgldu
naley uwaa, by nie pisa aplikacji w sposb, ktry mgby doprowadzi do kopotw.

3.6. Odwoywanie si
do metod i waciwoci
przy uyciu zmiennej $this
Podczas wykonywania metody obiektu definiowana jest automatycznie specjalna
zmienna o nazwie , ktra jest odwoaniem do samego obiektu. Uywajc tej zmiennej i notacji  mona odwoywa si do metod i waciwoci tego obiektu. Na przykad mona uzyska dostp do waciwoci
 przy uyciu instrukcji 

(naley zauway, e przed nazw waciwoci nie uywa si znaku ). Metody
obiektu mona udostpni w ten sam sposb: na przykad z wntrza jednej z metod
klasy osoby (  
) mona wywoa funkcj , wpisujc instrukcj 
.

3.6.1. Waciwoci public, protected i private


W programowaniu obiektowym kluczowym paradygmatem jest hermetyzacja i kontrola dostpu do waciwoci obiektu (nazywanych take zmiennymi skadowymi).
W najpopularniejszych jzykach obiektowych mona spotka trzy gwne sowa kluczowe kontroli dostpu: , 

i 
.

82

PHP5. Tajniki programowania

Definiujc skadow klasy w definicji klasy, programista musi przed zadeklarowaniem samej skadowej umieci jedno z tych trzech sw. Osoby zaznajomione z modelem obiektowym PHP3 lub 4 wiedz, e w tamtych wersjach wszystkie skadowe
klasy byy definiowane ze sowem kluczowym . W PHP5 jego odpowiednikiem
jest sowo kluczowe , cho etykieta  zostaa zachowana w celu zapewnienia
kompatybilnoci ze starszymi wersjami programu. Skadnia ta jest jednak przestarzaa,
dlatego namawiamy do przeksztacenia swych skryptw i dostosowania ich do nowych
wymogw:
 !

  (&# &+',
$-
(&#%



 ( # $ &+',
$-
#


 (.
 &+',
$-
( -


     $
// ...


&
 !


Ten przykad bdzie jeszcze rozbudowywany, w celu zademonstrowania uycia tych


modyfikatorw dostpu.
Najpierw jednak podajmy definicj kadego z modyfikatorw dostpu:
 . Dostp do skadowych publicznych mona uzyska spoza obiektu
przy uyciu kodu   oraz z wntrza metody ! 
przy uyciu specjalnej zmiennej  (na przykad   ).

Jeli skadow publiczn odziedziczy inna klasa, zastosowanie maj te same


zasady, co oznacza, e dostp do niej mona uzyska tak z obiektw spoza
klasy pochodnej, jak i z wntrza metod do niej nalecych.
 

. Dostp do skadowych chronionych mona uzyska tylko z wntrza
metody obiektu na przykad    . Jeli inna klasa

odziedziczy skadow chronion, zastosowanie maj te same zasady, mona


zatem do niej sign z wntrza metody pochodnego obiektu poprzez
specjaln zmienn .
 
. Skadowe prywatne s podobne do skadowych chronionych, poniewa

dostp do nich jest moliwy tylko z wntrza metody obiektu. Nie s natomiast
dostpne z metod obiektw pochodnych. Poniewa waciwoci prywatne
nie s widoczne z klas pochodnych, dwie pokrewne ze sob klasy mog
deklarowa te same waciwoci prywatne. Kada klasa bdzie widzie
tylko wasn prywatn kopi, ktra nie jest powizana z innymi.
Zazwyczaj w przypadku skadowych, ktre maj by dostpne spoza obiektu, naley
uywa sowa , za dla tych, ktre s wedug logiki obiektu wewntrzne,
sowa 
. Z kolei sowa 

naley uywa do tych skadowych, ktre
wedug logiki obiektu s wewntrzne, ale tylko wtedy, gdy rozsdne jest ich zignorowanie w klasach pochodnych:

Rozdzia 3. Jzyk obiektowy

83

 /&!# !



  0 1


 $&2 
#
 

 ## 2
$
//

 3/ ! /&!# !


 /4!# !



 $&2 
5# 


Ten przykad niepenego kodu przedstawia typowe uycie kadego z trzech modyfikatorw dostpu. Klasa z naszego przykadu zarzdza poczeniem z baz danych,
wczajc w to kierowane do bazy zapytania:
 Uchwyt poczenia z baz danych znajduje si w skadowej 
, poniewa

wykorzystywany jest tylko przez wewntrzn logik klasy i nie powinien by


dostpny dla uytkownika tej klasy.
 W tym przykadzie nazwa hosta bazy danych nie zostaje ujawniona
uytkownikowi klasy !"#$


$. Aby to anulowa, programista

moe stworzy klas pochodn i zmieni warto.


 Sam wynik zapytania powinien by dostpny dla programisty i dlatego zosta

zadeklarowany jako publiczny.


Naley zauway, e modyfikatory dostpu zostay zaprojektowane w sposb, ktry
pozwala na to, by klasy (lub bardziej dokadnie ich interfejs pozwalajcy na komunikacj ze wiatem zewntrznym) zawsze zachowyway podczas dziedziczenia relacj
jest. W takim przypadku, jeli klasa macierzysta zadeklaruje skadow jako publiczn, dziedziczcy potomek musi rwnie zadeklarowa j jako publiczn. W przeciwnym razie nie byby w stosunku do swojej klasy nadrzdnej w relacji jest, ktra
oznacza, e cokolwiek zrobi si z klas macierzyst, mona to take zrobi z potomn.

3.6.2. Metody public, protected i private


Modyfikatorw dostpu mona rwnie uywa w poczeniu z metodami obiektu;
zasady s w tym przypadku takie same jak poprzednio:
 Metody publiczne () mona wywoywa z kadego zasigu.
 Metody chronione (

) mona wywoywa tylko z wntrza jednej

z metod klasy lub klasy dziedziczcej.


 Metody prywatne (
) mona rwnie wywoywa z wntrza jednej

z metod klasy obiektu, ale nie z klasy dziedziczcej. Podobnie jak w przypadku
waciwoci, metody 
mog by ponownie definiowane przez klasy
dziedziczce. Kada klasa bdzie widzie wasn wersj metody:
 /&!# !

    ## 

 # #
/&!# 

84

PHP5. Tajniki programowania


  /&!#  #

  #



   #
/&!# 


  0"## #
 


    /&!#  #

 $&!#  #


 $&!# 

 3/ ! /&!# !


 /&!# !



   #
/&!# 


  0"## 5# 



Ten przykadowy zarys kodu moe by uyty w stosunku do klas pocze z baz danych.
Metoda 

 ma by wywoywana przez kod zewntrzny. Metoda  "$





 jest metod wewntrzn, ale pozwala na dziedziczenie z klasy oraz na jej
zmian, dlatego jest oznaczona sowem 

. Metoda "#$


 jest cakowicie wewntrzna wzgldem klasy i dlatego take ona oznaczona jest jako 
.
W przypadku braku modyfikatora dostpu dla metody domylnie uywana jest
opcja . Z tego powodu w pozostaych rozdziaach sowo kluczowe 
bdzie czsto pomijane.

3.6.3. Waciwoci statyczne


Wiadomo ju, e w klasach mona deklarowa waciwoci. Kady egzemplarz klasy
(tj. obiekt) ma wasn kopi tych waciwoci. Jednak klasa moe rwnie zawiera
waciwoci statyczne. W przeciwiestwie do zwykych waciwoci, te nale do
samej klasy, a nie do ktregokolwiek z jej egzemplarzy. Std s one czsto nazywane
waciwociami klasy, w przeciwiestwie do waciwoci obiektu lub egzemplarza.
Mona o nich myle rwnie jako o zmiennych globalnych, ktre znajduj si
w klasie, ale poprzez t klas s dostpne wszdzie.
Waciwoci statyczne definiuje si przy uyciu sowa kluczowego  :
 !

   +
#6

&
   7 
%$+
#6

&8


Aby uzyska dostp do waciwoci statycznych, naley poda nazw waciwoci


z klas, w ktrej si ona znajduje:

Rozdzia 3. Jzyk obiektowy

85

 !
99 7 
%$+
#6

&::
  !
99 7 
%$+
#6

&

Wynikiem wykonania kodu z tego przykadu bdzie wywietlenie liczby 1.


W przypadku pobierania skadowej z wntrza jednej z metod klasy, do waciwoci
mona rwnie odwoywa si poprzedzajc j specjaln nazw klasy %. Jest to
skrt oznaczajcy klas, do ktrej naley metoda:
 !

   7 
%$+
#6

&8
     $

 599 7 
%$+
#6

&


&
 !

&  $

Kod z tego przykadu wywietli liczb 0.


Niektrzy z czytelnikw zadaj sobie prawdopodobnie pytanie, czy waciwoci statyczne s naprawd przydatne.
Jednym z przykadw ich uycia jest przypisanie niepowtarzalnego numeru identyfikacyjnego do wszystkich egzemplarzy klasy:
 )07/!

   $! 8
  07$
   ""# # 

599 $! ::
 07$599 $! 


&;
 )07$!

  &;07$
&<
 )07$!

  &<07$

Wynikiem tego skryptu bdzie:


;
<

Warto waciwoci 
&' pierwszego obiektu rwna si (, za drugiego ).
Jeszcze lepszym przykadem wykorzystania waciwoci statycznej jest wzorzec Singleton, przedstawiony w nastpnym rozdziale.

86

PHP5. Tajniki programowania

3.6.4. Metody statyczne


Podobnie jak w przypadku waciwoci, w PHP mona definiowa jako statyczne
take metody. Taka metoda jest czci klasy i nie jest przypisana do adnego okrelonego egzemplarza obiektu i jego waciwoci. Std nie jest w niej dostpna zmienna , za klasa jest dostpna przy uyciu sowa %. Poniewa metody statyczne
nie s przypisane do adnego okrelonego obiektu, mona je wywoywa bez tworzenia egzemplarza obiektu przy uyciu skadni
*+,!--. Mona rwnie
wywoywa je z egzemplarza obiektu przy uyciu , jednak  nie
zostanie zdefiniowane w wywoywanej metodzie. Dla wikszej przejrzystoci zamiast
skadni  winno si uywa %--.
Oto przykad:
  
     ( 2=$

 =
>-#
599( -

     ( -

 


  99( 2=$

Przykad wywietla acuch ./ 0+., po ktrym nastpuje znak nowego


wiersza.
Cho przykad ten jest raczej mao przydatny, pozwala zaobserwowa, e funkcj
 
1/  mona wywoywa w klasie bez tworzenia egzemplarza obiektu

przy uyciu nazwy klasy, za sama metoda statyczna moe wywoa nastpn metod
statyczn  
+
 przy uyciu notacji %--. Istnieje moliwo wywoania
metody statycznej klasy nadrzdnej przy uyciu notacji  
--, co zostanie omwione nieco dalej w tym samym rozdziale.

3.7. Stae klasy


Stae globalne istniay w PHP od dawna. Mona je byo definiowa przy uyciu funkcji
%
, ktra zostaa opisana w rozdziale 2., zatytuowanym Podstawy jzyka PHP5.
Dziki ulepszonej obsudze hermetyzacji w PHP5 mona zdefiniowa stae wewntrz
klas. Podobnie jak w przypadku skadowych statycznych, nale one do klasy, a nie
do egzemplarzy klasy. W staych klasy zawsze rozrniania jest wielko liter. Skadnia deklaracji jest intuicyjna, a sposb dostpu do staych przypomina dostp do skadowych statycznych:

Rozdzia 3. Jzyk obiektowy

87

 !? !

  1?/!%- 
  @1??A 
  4*)?&'
   ( 4

 5994*)?


  !? !
991?/
&
 !? !

&( 4

Ten kod wywietli acuch .$* +


!., a po nim .,.. Przykad demonstruje
moliwo udostpniania staej z wntrza metody klasy przy uycia sowa kluczowego % i poprzez nazw klasy . !$ 2
$..
Jak mona wnioskowa z nazwy, stae maj stay, niezmienny charakter i po zdefiniowaniu nie mona ich zmienia ani usuwa. Do popularnych zastosowa staych
naley definiowane wylicze, co zostao zaprezentowane w ostatnim przykadzie, lub
pewnej wartoci konfiguracyjnej, takiej jak nazwa uytkownika bazy danych, ktrej
aplikacja nie powinna mc zmieni.
Podobnie jak w przypadku zmiennych globalnych, przyjte jest pisanie nazw staych wielkimi literami.

3.8. Klonowanie obiektw


W przypadku tworzenia obiektu przy uyciu sowa kluczowego 
, zwrcona warto jest uchwytem do obiektu lub mwic inaczej numerem identyfikacyjnym obiektu. To odrnia PHP5 od jego wczeniejszej wersji, w ktrej warto bya
po prostu obiektem. Nie oznacza to, e skadnia wywoania metod lub udostpniania
waciwoci ulega zmianie, ale zmienia si semantyka kopiowania obiektw.
Rozwamy nastpujcy kod:
 !

  .
;

&;
 !

&< &;
&<.
<
  &;.


W PHP4 ten kod zwrciby liczb 1, poniewa do zmiennej ) jest przypisana
warto obiektu (, tworzc w ten sposb kopi i pozostawiajc ( bez zmian.

88

PHP5. Tajniki programowania

Jednak w PHP5 ( jest uchwytem obiektu (jest numerem identyfikacyjnym), wic
do ) jest kopiowany uchwyt. Podczas zmiany zmiennej ), mona w rzeczywistoci zmieni sam obiekt, do ktrego zmienna ( si odnosi. Wykonanie tego
fragmentu kodu powoduje otrzymanie liczby 2.
Czasami jednak naprawd chodzi o utworzenie kopii obiektu. Jak mona to osign?
Rozwizaniem jest konstrukcja jzykowa 
. Ten wbudowany operator tworzy
automatycznie nowy egzemplarz obiektu z jego wasn kopi waciwoci. Wartoci
waciwoci zostaj skopiowane w swej pierwotnej postaci. Dodatkowo mona zdefiniowa metod 
, ktra jest wywoywana na nowo utworzonych obiektach
w celu wykonania wszystkich kocowych operacji.
Referencje po skopiowaniu pozostaj referencjami i nie wykonuj penej kopii zawartoci struktury. Oznacza to, e jeli jedna z waciwoci wskazuje przez referencj na inn zmienn (po tym jak zostaa ona przypisana przez referencj), to
po automatycznym klonowaniu, obiekt sklonowany bdzie wskazywa na t sam
zmienn.

Zmiana w ostatnim przykadzie wiersza )  ( na )  


 (
spowodowaoby przypisanie do ) uchwytu do nowej kopii (, wskutek czego
otrzymanym wynikiem byaby liczba 1.
Jak zostao ju wczeniej wspomniane, metod 
 mona implementowa dla
wszystkich klas. Jest ona wywoana po utworzeniu nowego (skopiowanego) obiektu,
a sklonowany obiekt jest dostpny przy uyciu zmiennej .
Poniej pokazano przykad typowej sytuacji, w ktrej warto zaimplementowa metod 
. Powiedzmy, e mamy obiekt zawierajcy uchwyt do pliku. Nie chcemy, by nowy obiekt wskazywa na ten sam uchwyt do pliku. Powinien otwiera nowy
plik, aby mie wasn, prywatn kopi:
 3
    3
 5"


 5"
 5"


   (331
$

 5"
$5( 5"
B

   ""#

  5"
$
 5"
$5( 5"
B



 5"


 5"
$)**


Rozdzia 3. Jzyk obiektowy

89

Cho jest to zaledwie fragment kodu, pozwala zaobserwowa sposb kontroli nad
procesem klonowania. Zmienna %
 zostaje tutaj skopiowana z oryginalnego
obiektu, ale jeli ten ma uchwyt otwartego pliku, ktry zosta skopiowany do sklonowanego obiektu, nowa kopia obiektu utworzy wasn kopi uchwytu pliku, tworzc
nowe poczenie z tym plikiem.

3.9. Polimorfizm
Polimorfizm jest prawdopodobnie najwaniejszym zagadnieniem zwizanym z programowaniem obiektowym. Uycie klas i dziedzicznoci uatwia opisanie rzeczywistych sytuacji, czego nie da si powiedzie o zwykym zbiorze funkcji i danych.
Dziedziczno uatwia take rozwj projektw przez ponowne wykorzystanie kodu.
Ponadto, piszc duy i rozszerzalny kod, zazwyczaj zaley nam na jak najmniejszej
liczbie instrukcji sterowania przepywem (takich jak instrukcje %). Odpowiedzi na
te wszystkie potrzeby i na wiele innych jest polimorfizm.
Rozwamy nastpujcy kod:
!

    


  



/
   -55

 



  ( C1 +$ &

  &
#5!

 & 



  &
#5/
 &-55



 4,D$9%'
%
%, $%
&' 

 

( C1 +$
!

( C1 +$
/

W wyniku otrzymamy:





90

PHP5. Tajniki programowania

Nietrudno zauway, e ten przykad nie jest rozszerzalny. Zamy, e chcemy go


rozszerzy o odgosy trzech kolejnych zwierzt. Oznaczaoby to dodanie do funkcji
 
34 5
 kolejnego bloku

, aby sprawdza, czy dany obiekt jest
egzemplarzem jednego z tych nowych gatunkw zwierzt. Nastpnie naleaoby doda kod, ktry wywoywaby metod kadego odgosu.
Problem ten rozwizuje zastosowanie polimorfizmu z uyciem dziedzicznoci, gdy
pozwala na dziedziczenie z klasy nadrzdnej, co oznacza dziedziczenie wszystkich jej
metod i waciwoci oraz utworzenie w ten sposb zwizku jest.
Aby dostosowa poprzedni przykad do wspomnianych potrzeb, utworzona zostanie
w nim nowa klasa, o nazwie 6
, z ktrej bd dziedziczy wszystkie zwierzta,
tworzc relacj jest od okrelonych rodzajw zwierzt, na przykad psa (klasa " )
do klasy nadrzdnej (lub przodka) 6
.
Dziedziczenie wykonuje si przy uyciu sowa kluczowego

 :
  '

%$'



Oto jak mona przepisa poprzedni przykad z wykorzystaniem dziedzicznoci:


E

   
'+$

 4,D$9C
  $
(-
& F(-%
 (  -

-'

#
(   #


!


E

   
'+$

  



/

E

   
'+$

 



  ( C1 +$ &

  &
#5E

 &
'+$



 4,D$9%'
%
%, $%
&' 

 


Rozdzia 3. Jzyk obiektowy

91

( C1 +$


!

( C1 +$
/

Wynikiem bd acuchy:





Warto zauway, e tym razem, bez wzgldu na liczb gatunkw zwierzt dodanych
do przykadu, nie trzeba bdzie wprowadza adnych zmian w funkcji  
34
5
. Wszystkimi zmianami zajmie si warunek 

% 6
 oraz wywoanie ,5
.
Ten przykad mona jeszcze poprawia. W PHP dostpne s pewne modyfikatory,
ktre mog zwikszy kontrol nad procesem dziedziczenia. Zostay one omwione
szczegowo w dalszej czci tego rozdziau. Na przykad klas 6
 i jej metod
,5
 mona oznaczy jako abstrakcyjn przy uyciu modyfikatora  .
Pozwoli to unikn dodawania nic nieznaczcych implementacji definicji metody 
,5
 w klasie 6
, ale wymusi rwnie jej implementacj we wszystkich klasach dziedziczcych. Dla metody ,5
 mona ponadto poda modyfikatory
dostpu. Na przykad modyfikator  bdzie oznacza, e metod t mona bdzie
wywoywa z kadego miejsca w kodzie.
PHP nie obsuguje dziedziczenia wielokrotnego, ktre wystpuje w jzyku C++.
Dostarcza za to inne rozwizanie prowadzce do utworzenia wicej ni jednej relacji jest dla danej klasy, wykorzystujce interfejsy podobne do tych z jzyka Java;
zostan one omwione w dalszej czci tego rozdziau.

3.10. parent:: i self::


W PHP obsugiwane s dwie zarezerwowane nazwy klas, ktre uatwiaj pisanie
aplikacji obiektowych. Nazwa %-- odnosi si do biecej klasy i zazwyczaj suy
do pobierania skadnikw statycznych, metod i staych. Nazwa  
-- odnosi si do
klasy nadrzdnej i najczciej jest wykorzystywana, kiedy zachodzi potrzeba wywoania konstruktora lub metod nadrzdnych. Moe rwnie suy do pobierania skadowych i staych. Nazwy  
-- naley uywa zamiast nazwy klasy nadrzdnej,
poniewa uatwia to zmian hierarchii klasy. Dziki temu nazwa przodka nie jest wpisana na stae w kod.
Poniszy przykad wykorzystuje nazwy  
-- i %-- w celu udostpnienia klas
$ i 6
 :
E# 
  E?%$'
   ""# # 

 =' ' %599E?



92

PHP5. Tajniki programowania


!$

E# 
  E?  '
   ""# # 

(
 99""# # 
 =' ' %599E?


&
!$

W wyniku wykonania tego przykadowego kodu na ekranie pojawi si:


=' ' %%$'
=' ' %  '

Tych dwch nazw klas warto uywa wszdzie tam, gdzie jest to tylko moliwe.

3.11. Operator instanceof


Operator 

% zosta dodany do PHP jako pewien rodzaj syntaktycznego ozdobnika, ktry mia zastpi wbudowan i aktualnie przestarza funkcj . W przeciwiestwie do niej, sposb uycia 

% przypomina zastosowanie logicznego
operatora binarnego:
1#

  
""!*E++""

+0


1#

  
""!*E++""

!#
  
""!*E++""

  ##'751#
 
(

  
(
#51#

  
(

  ( 'D  


##'751#

+0

##'751#

!#

Ten may program wywietli komunikat 75&  ,89


7. Warto zwrci uwag na uycie staej $655. Jest to specjalna staa, ktra zwraca nazw biecej klasy.

Rozdzia 3. Jzyk obiektowy

93

Jak zostao ju wczeniej wspomniane, 



% jest operatorem i dlatego moe
by uywany w wyraeniach w poczeniu z innymi operatorami (na przykad z operatorem negacji :). Umoliwia to proste napisanie funkcji ,'%4
:
  ##'75 1#
 
(

 G 
(
#51#

  
(

  ( 'D  



Operator 

% sprawdza rwnie, czy obiekt implementuje interfejs (ktry
take jest klasyczn relacj jest). Interfejsy zostay omwione w dalszej czci
rozdziau.

3.12. Metody i klasy abstrakcyjne


Podczas projektowania hierarchii klas warto pozostawi niektre metody do implementacji przez klasy dziedziczce. Zamy na przykad, e mamy klas o hierarchii
przedstawionej na rysunku 3.2.
Rysunek 3.2.
Hierarchia klasy

Jedn z rozsdnych moliwoci jest zaimplementowanie metody definiujcej rodek


figury $
  ;< ! w klasie 5 i pozostawienie implementacji rysujcej figury metody  + do konkretnych klas 5&  i $ . W tym celu metod  +
naley zdefiniowa jako metod  . Dziki temu poinformujemy PHP, e specjalnie nie implementujemy jej w klasie 5. Klasa 5 stanie si klas abstrakcyjn, co oznacza, e nie jest to klasa o penej funkcjonalnoci i mona z niej tylko
dziedziczy. Klasa abstrakcyjna nie moe mie egzemplarzy. Modyfikator  

94

PHP5. Tajniki programowania

mona zdefiniowa dla dowolnej liczby metod w klasie, jednak wystarczy, by cho
jedna metoda z klasy zostaa zadeklarowana jako abstrakcyjna, by jako tak naleao
zadeklarowa ca klas. Ta podwjna definicja pozwala zdefiniowa klas jako 
 , nawet jeli nie zawiera ona adnych abstrakcyjnych metod, i wymusza, by klasa posiadajca metody abstrakcyjne sama zostaa zadeklarowana jako abstrakcyjna,
co pozwoli na lepsze zrozumienie intencji programisty.
Poprzedni diagram klas mona by przetumaczy na nastpujcy kod PHP:

& 
# +
(
    !  HB 
 H H
  


& 
#    $
-


 HB

+0


+
(
   $
-

// Tutaj kod rysujcy kwadrat



!#

+
(
   $
-

// Tutaj kod rysujcy koo




Jak wida, metoda abstrakcyjna  + nie zawiera adnego kodu.


W przeciwiestwie do niektrych jzykw, nie mona definiowa metody  
z domyln implementacj. W PHP metoda moe by abstrakcyjna, czyli bez kodu, lub w peni zdefiniowana.

3.13. Interfejsy
Dziedziczenie klas umoliwia opisywanie relacji rodzic-potomek midzy klasami.
Mona na przykad mie klas bazow ksztatw 5, z ktrej wywodz si klasy
kwadratw 5&  i k $ . Czsto zachodzi jednak konieczno dodania do klas
dodatkowych interfejsw, co zasadniczo oznacza dodatkowe warunki, do ktrych
musi zastosowa si klasa. W jzyku C++ osiga si to przy uyciu dziedziczenia
wielokrotnego i wyprowadzania z dwch klas. W PHP alternatyw dla dziedziczenia

Rozdzia 3. Jzyk obiektowy

95

wielokrotnego s interfejsy, umoliwiajce okrelanie dodatkowych warunkw, jakie


musi spenia klasa. Interfejs definiuje si podobnie do klasy, ale zawiera on tylko
prototypy funkcji (bez implementacji) oraz stae. Kada klasa, ktra implementuje ten
interfejs automatycznie, bdzie miaa zdefiniowane stae interfejsu i, jako klasa realizujca, musi dostarczy definicje funkcji dla prototypw funkcji interfejsu, z ktrych
wszystkie s metodami   (chyba e jako   zostaa zadeklarowana klasa realizujca).
Aby dokona implementacji interfejsu, naley zastosowa nastpujc skadni:
E

4B!B



Klasy realizujce dany interfejs pozostaj w relacji jest do interfejsu (



%);
jeli na przykad klasa 6 implementuje interfejs !'
 %, poniszy kod spowoduje
wydrukowanie 7  * *!'
 %7:
&
E
  &
#5 7 5
#
 I & % (
%  7 5
#I


Kod naszego kolejnego przykadu definiuje interfejs o nazwie  . Bdzie on


realizowany przez klasy w celu zdefiniowania informacji, ktre ma rejestrowa funkcja ! . Obiekty klas, ktre nie zaimplementuj tego interfejsu i zostan przekazane do funkcji ! , spowoduj wywietlenie komunikatu o bdzie:

 
*
&
   + 



*
&

 
B
$$B $ &B

   + 

 '

9
%-' 
B7/ $ &


$# 

*
&

 
B (#B H( /

   + 

 '

$# 9
%-
 
B#
 (#


   * &
  &
#5*
&
  &+ 



 4,D$9J&' &, 5*
&



96

PHP5. Tajniki programowania


(

// ...
($# 
$# 
 * (
 * ($# 

Interfejsy s domylnie publiczne, dlatego w definicji interfejsu nie mona okrela modyfikatorw metody dla prototypw metod.

Nie wolno dopuszcza do implementacji interfejsw, ktre ze sob koliduj (na


przykad interfejsy definiujce te same stae lub metody).

You might also like