You are on page 1of 56

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

Zaawansowane
programowanie w PHP4
Autor: praca zbiorowa
ISBN: 83-7197-729-8
Tytu oryginau: Professional PHP 4
Format: B5, stron: 990

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

W opinii autorw niniejsza ksika stanowi doskonae rdo wiedzy dla aktywnych
programistw, wykorzystujcych w swojej pracy PHP.
Ta ksika ma na celu umoliwienie twrcom aplikacji internetowych tworzenie
programw, ktre bd:
skalowalne,
wydajne,
bezpieczne,
modularne,
wielowarstwowe.
Ksika ta adresowana jest do programistw, ktrych znajomo PHP pozwala na
tworzenie i rozwijanie niewielkich aplikacji WWW. Pomimo e przedstawiamy skadni
PHP, liczymy na to, e programici czytajcy t ksik nie bd potrzebowali wykadu
na temat podstaw programowania.

Spis treci
O Autorach.....................................................................................................................................19
Wstp...........................................................................................................................................23
Dla kogo jest przeznaczona ta ksika? ................................................................................ 23
Zawarto ksiki .................................................................................................................. 24
Czego potrzeba, aby mona byo korzysta z tej ksiki? ...................................................... 27
Konwencje............................................................................................................................. 27

Rozdzia 1. Droga do PHP................................................................................................................29


Dlaczego PHP? ...................................................................................................................... 29
Ewolucja jzyka PHP .............................................................................................................. 30
Przeszo PHP ................................................................................................................ 30
PHP dzisiaj ....................................................................................................................... 30
PHP na ringu .................................................................................................................... 30
Przyszo PHP................................................................................................................. 31
PHP a inne jzyki ................................................................................................................... 31
PHP a ASP........................................................................................................................ 31
PHP a Cold Fusion ........................................................................................................... 32
PHP a Perl........................................................................................................................ 32
PHP a Java....................................................................................................................... 32
Licencje PHP ......................................................................................................................... 33
Dodatkowe rda informacji ................................................................................................. 33

Rozdzia 2. Instalacja.....................................................................................................................35
Mamy ju PHP........................................................................................................................ 35
Przed instalacj ..................................................................................................................... 37
Decyzje instalacyjne .............................................................................................................. 38
Ktry system operacyjny? ................................................................................................ 38
Modu czy CGI? ................................................................................................................ 38
Ktry serwer WWW?......................................................................................................... 40
Instalacja MySQL, Apache i PHP............................................................................................ 40
Instalacja w systemie Windows ............................................................................................. 40
Instalacja bazy MySQL ..................................................................................................... 41
Jakie komplikacje mog wystpi?............................................................................. 42
Instalacja serwera Apache............................................................................................... 43
Jakie komplikacje mog wystpi?............................................................................. 46
Instalacja PHP ................................................................................................................. 46
Konfiguracja Apache do obsugi PHP................................................................................ 48
Jakie komplikacje mog wystpi?............................................................................. 49

PHP4. Zaawansowane programowanie


Testowanie instalacji PHP................................................................................................ 50
Jakie komplikacje mog wystpi?............................................................................. 51
Czynnoci po instalacji..................................................................................................... 52
Przejcie na ISAPI ............................................................................................................ 54
Instalacja w systemach klasy UNIX ....................................................................................... 54
Instalacja MySQL ............................................................................................................. 55
Utworzenie uytkownika dla MySQL-a......................................................................... 55
Konfiguracja kodu rdowego MySQL-a ..................................................................... 56
Kompilacja MySQL-a................................................................................................... 57
Inicjalizacja MySQL-a.................................................................................................. 58
Uruchamianie MySQL-a .............................................................................................. 59
Testowanie MySQL-a .................................................................................................. 59
Zabezpieczanie MySQL-a............................................................................................ 60
Jakie komplikacje mog wystpi?............................................................................. 60
Instalacja Apache ............................................................................................................ 60
Czynnoci po instalacji Apache .................................................................................. 61
Jakie komplikacje mog wystpi?............................................................................. 62
Instalacja PHP ................................................................................................................. 63
Jakie komplikacje mog wystpi?............................................................................. 64
Kompilacja PHP.......................................................................................................... 65
Jakie komplikacje mog wystpi?............................................................................. 66
Czynnoci po instalacji..................................................................................................... 66
Integracja PHP z Apache .................................................................................................. 66
Jakie komplikacje mog wystpi?............................................................................. 68
Czynnoci po instalacji ............................................................................................... 69
Dodatkowe rda informacji ................................................................................................. 71
PHP.net............................................................................................................................ 71
Zend.com......................................................................................................................... 72
php4win.de...................................................................................................................... 72
Apache ............................................................................................................................ 73
MySQL ............................................................................................................................. 73

Rozdzia 3. Podstawy PHP..............................................................................................................75


Programy w PHP .................................................................................................................... 75
Skrypty PHP ..................................................................................................................... 76
Instrukcje .............................................................................................................................. 77
Komentarze ..................................................................................................................... 79
Literay .................................................................................................................................. 80
Literay tekstowe ............................................................................................................. 80
Dokumenty osadzone ...................................................................................................... 81
Literay liczbowe .............................................................................................................. 82
Literay logiczne ............................................................................................................... 82
Zmienne ................................................................................................................................ 83
Przypisanie ...................................................................................................................... 83
Odwoanie........................................................................................................................ 84
Stae...................................................................................................................................... 85
Typy danych........................................................................................................................... 85
Rzutowanie ...................................................................................................................... 86
Operatory i funkcje ................................................................................................................ 87
Operacje oglnego przeznaczenia .................................................................................... 89
Operacje na napisach ...................................................................................................... 90
Funkcje napisowe ............................................................................................................ 91
substr()....................................................................................................................... 91
strpos()....................................................................................................................... 91

Spis treci

htmspecialchars()....................................................................................................... 92
trim() .......................................................................................................................... 92
chr() oraz ord()............................................................................................................ 93
strlen()........................................................................................................................ 93
printf() oraz sprintf().................................................................................................... 93
Operacje liczbowe ............................................................................................................ 95
Operacje bitowe ......................................................................................................... 96
Operacje porwnania.................................................................................................. 97
Priorytety operatorw ................................................................................................. 98
Operacje logiczne............................................................................................................. 98
Priorytety operatorw ................................................................................................. 99
Tablice................................................................................................................................... 99
Zmienne zewntrzne.............................................................................................................. 99
Zmienne systemowe, zmienne GET oraz $HTTP_ Arrays .......................................... 100
Zmienne POST ......................................................................................................... 101
Cookies .................................................................................................................... 101
Zmienne CGI ............................................................................................................ 101
Zmienne nagwkw HTTP........................................................................................ 102

Rozdzia 4. Struktury w PHP.........................................................................................................103


Struktury kontroli przebiegu programu................................................................................. 103
Instrukcje warunkowe .................................................................................................... 103
If .............................................................................................................................. 103
switch....................................................................................................................... 106
Ptle .............................................................................................................................. 107
while......................................................................................................................... 108
do...while.................................................................................................................. 109
for ............................................................................................................................ 109
Alternatywna skadnia ptli ...................................................................................... 110
Funkcje................................................................................................................................ 110
Definiowanie funkcji....................................................................................................... 110
Zakres zmiennej ............................................................................................................ 112
Czas ycia zmiennej....................................................................................................... 113
Rekurencja..................................................................................................................... 114
Przypisywanie funkcji zmiennym..................................................................................... 114
Zastosowanie funkcji w celu uporzdkowania kodu ....................................................... 115
Komentarze ................................................................................................................... 118
Tablice................................................................................................................................. 118
Inicjacja tablic................................................................................................................ 119
Sekwencyjne przegldanie tablic ................................................................................... 120
Wbudowane funkcje tablicowe ....................................................................................... 120
count()...................................................................................................................... 120
in_array() .................................................................................................................. 121
reset() ...................................................................................................................... 121
sort() ........................................................................................................................ 121
explode() oraz implode() ........................................................................................... 122
Tablice predefiniowane .................................................................................................. 122
Tablice wielowymiarowe................................................................................................. 122

Rozdzia 5. Programowanie obiektowe w PHP4.............................................................................125


Programowanie zorientowane obiektowo ............................................................................. 125
Programowanie proceduralne a programowanie obiektowe............................................ 127
Znaczenie programowania obiektowego......................................................................... 128

PHP4. Zaawansowane programowanie


Zstpujca metoda tworzenia oprogramowania................................................................... 128
Klasy.............................................................................................................................. 129
Obiekty .......................................................................................................................... 132
Metody fabryczne ..................................................................................................... 133
Hermetyzacja (ang.Encapsulation) ................................................................................. 135
Dziedziczenie ................................................................................................................. 137
Operator wywoania metody klasy ............................................................................ 141
Ponowne wykorzystanie kodu ................................................................................... 141
Polimorfizm .................................................................................................................... 142
Metody abstrakcyjne ................................................................................................ 143
Adekwatno i powizania ............................................................................................. 146
Modelowanie obiektowe z uyciem UML.............................................................................. 148
Delegacja....................................................................................................................... 150
Analiza i decyzje projektowe ................................................................................................ 152
Funkcje PHP obsugujce klasy ........................................................................................... 154
get_class() ..................................................................................................................... 154
get_parent_class() ......................................................................................................... 155
Ograniczenia PHP ................................................................................................................ 155
Brak atrybutw statycznych............................................................................................ 156
Brak destruktorw ......................................................................................................... 157
Brak wielokrotnego dziedziczenia................................................................................... 158
Modelowanie zoonego komponentu WWW ........................................................................ 160

Rozdzia 6. Wykrywanie i usuwanie bdw..................................................................................165


Przegld bdw programistycznych..................................................................................... 166
Bdy skadni ................................................................................................................. 166
Bdy semantyczne ........................................................................................................ 167
Bdy logiczne................................................................................................................ 168
Bdy rodowiska........................................................................................................... 169
Poziomy bdw w PHP ........................................................................................................ 169
Bdy analizy.................................................................................................................. 170
Bdy krytyczne .............................................................................................................. 170
Ostrzeenia.................................................................................................................... 170
Uwagi............................................................................................................................. 170
Bdy na poziomie jdra................................................................................................. 171
Poziomy bdw etapu kompilacji .................................................................................. 171
Poziomy bdw definiowanych przez uytkownika ......................................................... 171
Ustawianie poziomw zgaszania bdw....................................................................... 171
Obsuga bdw................................................................................................................... 172
Wyciszanie komunikatw bdach.................................................................................. 172
Postpowanie w przypadku wystpienia bdu............................................................... 173
Sprawdzanie bdw w nietypowych sytuacjach ............................................................. 174
Raportowanie bdw..................................................................................................... 175
Programy wspomagajce wykrywanie bdw ...................................................................... 176
Narzdzia do wykrywania bdw wykorzystujce protok HTTP .................................... 177
Klient telnet ............................................................................................................. 177
Serwery nasuchujce .............................................................................................. 178
Metoda ledzenia .......................................................................................................... 179
phpCodeSite ............................................................................................................ 180
Zdalne systemy wykrywania bdw ............................................................................... 185
BODY........................................................................................................................ 185
Zend IDE .................................................................................................................. 187
Testowanie skryptowe ......................................................................................................... 188

Spis treci

Rozdzia 7. Wprowadzanie danych i wyraenia regularne ............................................................193


Wprowadzanie danych ......................................................................................................... 193
Formularze .......................................................................................................................... 194
Formularze HTML........................................................................................................... 194
Atrybut action........................................................................................................... 195
Atrybut method......................................................................................................... 195
Obsuga wprowadzanych danych ......................................................................................... 196
Skomplikowane formularze ............................................................................................ 197
Weryfikacja danych ........................................................................................................ 200
OOH Forms............................................................................................................... 201
Przykadowa aplikacja .............................................................................................. 201
Zabezpieczenie przed niewaciwym uyciem ........................................................... 210
Wyraenia regularne ............................................................................................................ 211
Podstawy skadni wyrae regularnych .......................................................................... 211
Tworzenie wyrae regularnych ...................................................................................... 213
Weryfikacja poprawnoci adresw e-mail ................................................................. 215
Wyraenia regularne w PHP............................................................................................ 215
Wyraenia regularne zgodne z mechanizmami jzyka Perl.............................................. 218
Funkcje PHP obsugujce PCRE................................................................................ 220

Rozdzia 8. Sesje oraz ciasteczka................................................................................................225


Sesje ................................................................................................................................... 226
Uaktywnianie obsugi sesji w PHP .................................................................................. 226
Zastosowanie sesji PHP................................................................................................. 227
Uruchamianie sesji ........................................................................................................ 228
Rejestrowanie zmiennych sesji ...................................................................................... 228
Tworzenie wasnych procedur obsugi sesji .................................................................... 230
Ustawianie bazy danych ........................................................................................... 230
Adresy URL.......................................................................................................................... 235
Bezpieczestwo ............................................................................................................. 235
Ciasteczka........................................................................................................................... 236
Bezpieczestwo ............................................................................................................. 237
Zastosowania ciasteczek............................................................................................... 237
Termin wanoci....................................................................................................... 238
cieka .................................................................................................................... 239
Domena ................................................................................................................... 239
Przykadowa aplikacja wykorzystujca ciasteczka .......................................................... 240
setcookie()..................................................................................................................... 241
Ustawianie parametru okresu wanoci ciasteczka ................................................. 242
Ograniczanie dostpu............................................................................................... 243
Usuwanie ciasteczka ..................................................................................................... 246
czenie informacji z ciasteczek.................................................................................... 246
Problemy z ciasteczkami................................................................................................ 248
Dodatkowe funkcje obsugi sesji.......................................................................................... 250

Rozdzia 9. Obsuga plikw ..........................................................................................................253


Pliki...................................................................................................................................... 253
Otwieranie plikw........................................................................................................... 254
Zamykanie plikw .......................................................................................................... 255
Wypisywanie zawartoci plikw ...................................................................................... 255
Odczyt zawartoci plikw ............................................................................................... 256
Zapis do plikw.............................................................................................................. 257

PHP4. Zaawansowane programowanie


Nawigowanie po pliku .................................................................................................... 257
Kopiowanie, usuwanie i zmiana nazw plikw ................................................................. 258
Okrelanie atrybutw plikw .......................................................................................... 259
Katalogi ............................................................................................................................... 260
Dodawanie i usuwanie katalogw .................................................................................. 262
Przesyanie plikw z przegldarki......................................................................................... 263
Przesyanie plikw za porednictwem metody PUT ........................................................ 264
Przesyanie plikw z wykorzystaniem metody POST ....................................................... 264
Przykadowa aplikacja obsugi systemu plikw .................................................................... 267
Aplikacja suca do przechowywania plikw online....................................................... 267
Wsplne mechanizmy............................................................................................... 270
Rejestracja nowego uytkownika .............................................................................. 272
Logowanie................................................................................................................ 276
Tworzenie katalogw ................................................................................................ 282
Usuwanie katalogu lub pliku..................................................................................... 282
Wysyanie plikw na serwer...................................................................................... 283
Przegldanie plikw.................................................................................................. 284
Przegldanie katalogw............................................................................................ 285
Wylogowanie ............................................................................................................ 286

Rozdzia 10. Programowanie klientw FTP ...................................................................................287


Uaktywnianie obsugi FTP w PHP ......................................................................................... 288
Rozszerzenia obsugi FTP w PHP.......................................................................................... 288
Tworzenie aplikacji klientw FTP .................................................................................... 289
Procedury uatwiajce korzystanie z FTP................................................................... 290
Klient FTP oparty na WWW .................................................................................................. 299
Tworzymy klienta FTP ..................................................................................................... 308
Przegld funkcji FTP wedug zastosowania .......................................................................... 311
Nawizywanie i zrywanie poczenia .............................................................................. 311
Operacje na katalogach ................................................................................................. 312
Obsuga plikw............................................................................................................... 312
Alfabetyczny przegld funkcji FTP......................................................................................... 313
Podstawowe polecenia FTP oraz odpowiadajce im funkcje PHP......................................... 323

Rozdzia 11. Poczta elektroniczna i grupy dyskusyjne...................................................................327


Jak dziaa poczta elektroniczna? ......................................................................................... 328
Niezbyt tajni agenci........................................................................................................ 329
SMTP ............................................................................................................................. 329
Struktura listu elektronicznego............................................................................................ 331
Nagwki listu elektronicznego....................................................................................... 331
Nagwki wymagane ................................................................................................. 332
Nagwki opcjonalne ................................................................................................ 334
Wysyanie listw elektronicznych z wykorzystaniem funkcji mail() .................................. 335
Wykorzystanie funkcji mail()...................................................................................... 335
Tworzenie klasy KlasaPocztowa ............................................................................... 338
Testowanie klasy KlasaPocztowa ............................................................................. 344
Tworzenie klasy KlasaPocztowaSMTP ...................................................................... 345
Testujemy klas KlasaPocztowaSMTP ..................................................................... 352
List elektroniczny w formacie MIME............................................................................... 353
Pola nagwka listu elektronicznego w formacie MIME............................................. 354
Tworzenie klasy KlasaPocztowaMIME ...................................................................... 358
Testowanie klasy KlasaPocztowaMIME .................................................................... 362
Tworzenie klasy KlasaPocztowaSMTP_MIME ................................................................. 363

Spis treci

Usenet ................................................................................................................................ 364


Jak dziaa Usenet? ........................................................................................................ 365
Przykadowa sesja NNTP ................................................................................................ 365
Kody odpowiedzi serwera NNTP ..................................................................................... 368
Anatomia artykuu grupy dyskusyjnej ............................................................................. 370
Tworzenie klasy NNTP .................................................................................................... 371
Testowanie klasy KlasaNNTP ................................................................................... 377
czymy w cao wszystkie elementy................................................................................. 378
Dodatkowe rda informacji ............................................................................................... 385

Rozdzia 12. Pobieranie listw elektronicznych i artykuw grup dyskusyjnych...........................387


Protokoy suce do pobierania poczty elektronicznej ........................................................ 388
POP................................................................................................................................ 388
Przykadowa sesja POP............................................................................................. 389
IMAP .............................................................................................................................. 390
Znaczniki .................................................................................................................. 391
Formaty skrzynek pocztowych................................................................................... 391
Przykadowa sesja IMAP ........................................................................................... 392
Porwnanie protokou POP z IMAP ................................................................................. 396
Pobieranie poczty elektronicznej za pomoc PHP ................................................................ 397
Poczenie z serwerem .................................................................................................. 397
Przykad poczenia .................................................................................................. 399
Tworzenie klasy Webmail ............................................................................................... 400
Atrybuty .................................................................................................................... 400
Testowanie klasy Webmail ....................................................................................... 403
Pobieranie zawartoci skrzynki pocztowej lub grupy dyskusyjnej.................................... 403
Pobieranie zawartoci skrzynki lub grupy dyskusyjnej w klasie Webmail ........................ 410
Nowe atrybuty .......................................................................................................... 410
Testowanie klasy Webmail ....................................................................................... 413
Pobieranie listw i artykuw.......................................................................................... 414
Odczytywanie listw z wykorzystaniem klasy Webmail ................................................... 416
Nowe atrybuty .......................................................................................................... 416
Testujemy klas Webmail......................................................................................... 420
Praca ze skrzynkami ...................................................................................................... 422
Zarzdzanie skrzynkami z wykorzystaniem klasy Webmail ............................................. 425
Nowe atrybuty .......................................................................................................... 425
Operacje na listach i artykuach..................................................................................... 428
Operacje na listach wykonywane z wykorzystaniem klasy Webmail................................ 430
Nowe atrybuty .......................................................................................................... 430
System obsugi poczty elektronicznej oparty na przegldarce WWW.................................... 433
Atrybuty .................................................................................................................... 433
Dodatkowe rda informacji ............................................................................................... 447

Rozdzia 13. Sieci i protok TCP/IP..............................................................................................449


Internet Protocol.................................................................................................................. 450
Protokoy warstwy transportowej ......................................................................................... 451
TCP Transmission Control Protocol ........................................................................... 451
UDP User Datagram Protocol .................................................................................... 452
Tumaczenie nazw domen ................................................................................................... 452
Hierarchiczny system rozproszony ................................................................................. 453
Wykorzystanie DNS w PHP ............................................................................................. 454
Biblioteka Resolver ........................................................................................................ 458

10

PHP4. Zaawansowane programowanie


Gniazda ............................................................................................................................... 463
Gniazda i PHP ................................................................................................................ 464
Aplikacja klienta pocztowego ......................................................................................... 469
Network Information Service ............................................................................................... 471
Serwery NIS ................................................................................................................... 472
Klienci NIS ..................................................................................................................... 473
Mapowania NIS.............................................................................................................. 473
NIS i PHP ....................................................................................................................... 475
Simple Network Management Protocol................................................................................ 477
Agenci i zarzdcy ........................................................................................................... 477
Protok SNMP............................................................................................................... 478
Get ........................................................................................................................... 478
Get Next................................................................................................................... 479
Set ........................................................................................................................... 479
Trap.......................................................................................................................... 479
Organizacja danych SNMP ............................................................................................. 479
Funkcje SNMP w PHP..................................................................................................... 480

Rozdzia 14. LDAP.........................................................................................................................485


Katalogi ............................................................................................................................... 485
LDAP.................................................................................................................................... 486
LDAP a tradycyjne bazy danych ...................................................................................... 486
Skadniki LDAP............................................................................................................... 488
LDAP charakterystyka ............................................................................................... 488
Globalne usugi katalogowe ..................................................................................... 489
Otwarty standard komunikacyjny .............................................................................. 489
Rozszerzalno i elastyczno ................................................................................. 489
Heterogeniczne repozytorium danych ....................................................................... 489
Bezpieczny protok z kontrol dostpu ................................................................... 490
Zastosowania LDAP ....................................................................................................... 490
Elementy terminologii LDAP ........................................................................................... 492
Modele LDAP ................................................................................................................. 493
Model informacyjny .................................................................................................. 493
Model nazw .............................................................................................................. 495
Model funkcjonalny .................................................................................................. 496
Zaawansowane cechy LDAP........................................................................................... 499
Operacje asynchroniczne.......................................................................................... 499
Replikacja ................................................................................................................ 499
Odsyacze................................................................................................................. 500
Bezpieczestwo........................................................................................................ 500
Waciwoci rozszerzone.......................................................................................... 500
Oprogramowanie LDAP ........................................................................................................ 501
Instalacja i konfiguracja serwera LDAP .......................................................................... 502
Plik konfiguracyjny serwera OpenLDAP ..................................................................... 502
Uruchamianie serwera slapd.................................................................................... 504
Sprawdzanie instalacji ................................................................................................... 505
Obsuga LDAP w jzyku PHP ................................................................................................ 505
Interfejs LDAP API jzyka PHP........................................................................................ 506
Funkcje poczeniowe i kontrolne............................................................................. 506
Funkcje wyszukujce ................................................................................................ 508
Funkcje modyfikujce ............................................................................................... 514
Funkcje obsugi bdw ............................................................................................ 516
Przykadowa aplikacja klienta LDAP w jzyku PHP ............................................................... 516

Spis treci

11

Rozdzia 15. Wprowadzenie do programowania aplikacji wielowarstwowych ..............................533


Rozwj aplikacji WWW ......................................................................................................... 533
Wielowarstwowo .............................................................................................................. 535
Warstwa danych............................................................................................................. 535
Model plikowy .......................................................................................................... 536
Model relacyjny ........................................................................................................ 537
Model XML ............................................................................................................... 538
Model mieszany ....................................................................................................... 540
Warstwa logiki aplikacji.................................................................................................. 540
Warstwa prezentacji....................................................................................................... 540
Urzdzenia korzystajce z sieci WWW............................................................................ 541
Architektury projektowania wielowarstwowego..................................................................... 541
Architektura oparta na jzyku HTML............................................................................... 542
Warstwa danych ....................................................................................................... 543
Warstwa logiczna ..................................................................................................... 543
Warstwa prezentacji ................................................................................................. 543
Architektura oparta na jzyku XML................................................................................. 545
Wyodrbnianie warstw......................................................................................................... 546
Programowanie moduowe ............................................................................................. 547
Niezaleno warstw logiki i prezentacji......................................................................... 547
Niezaleno warstw logiki i danych .............................................................................. 547
Niezaleno od bazy danych......................................................................................... 547
Ankieta projektowanie aplikacji wielowarstwowej............................................................ 548
Projektowanie modelu danych ....................................................................................... 548
Warstwa danych ....................................................................................................... 548
Warstwa logiczna ..................................................................................................... 549
Warstwa prezentacji ................................................................................................. 550
Klasyczna architektura wielowarstwowa ........................................................................ 550
Przypadek 1. Zmiana sposobu wywietlania wynikw gosowania ............................ 550
Przypadek 2. Zablokowanie moliwoci wielokrotnego gosowania uytkownika....... 550
Przypadek 3. Wersja Flash aplikacji ......................................................................... 551

Rozdzia 16. Aplikacja WAP studium przypadku .......................................................................553


Analiza wymaga ................................................................................................................. 553
Interakcja z uytkownikiem .................................................................................................. 555
Dobr oprogramowania ....................................................................................................... 555
Alternatywy dla bazy danych zaplecza ............................................................................ 557
Alternatywy dla warstwy poredniej................................................................................ 557
Projekt schematu bazy danych ............................................................................................ 558
Tabele bazy danych........................................................................................................ 558
Uytkownik bazy danych................................................................................................. 560
Indeksy .......................................................................................................................... 561
Kwestie projektowe warstwy poredniej .............................................................................. 562
Uwierzytelnianie............................................................................................................. 562
Przechowywanie danych sesji......................................................................................... 562
Kwestie zwizane z jzykiem WML................................................................................. 563
Wydajno ..................................................................................................................... 564
Implementacja..................................................................................................................... 564
Kod aplikacji .................................................................................................................. 566
Warstwa danych i logiki aplikacji .............................................................................. 572
Karta powitalna ........................................................................................................ 595
Rejestracja nowego uytkownika .............................................................................. 598
Logowanie................................................................................................................ 599

12

PHP4. Zaawansowane programowanie


Karta gwna aplikacji .............................................................................................. 601
Przegldanie zasobw ksigarni............................................................................... 605
Przegldanie zasobw sklepu muzycznego............................................................... 607
Wyszukiwanie........................................................................................................... 609
Dodawanie pozycji do koszyka uytkownika ............................................................. 612
Przegldanie zawartoci koszyka uytkownika.......................................................... 614
Zmiana liczby sztuk poszczeglnych pozycji koszyka................................................ 616
Zatwierdzanie zakupw ............................................................................................ 618
Przegldanie informacji o koncie uytkownika .......................................................... 620
Wylogowanie ............................................................................................................ 623

Rozdzia 17. PHP i MySQL .............................................................................................................625


Relacyjne bazy danych......................................................................................................... 626
Indeksy .......................................................................................................................... 627
Klucze............................................................................................................................ 627
Normalizacja .................................................................................................................. 629
Strukturalny jzyk zapyta ................................................................................................... 631
Zapytania definicji danych.............................................................................................. 632
CREATE DATABASE................................................................................................... 632
USE .......................................................................................................................... 633
CREATE TABLE.......................................................................................................... 633
DESCRIBE ................................................................................................................ 634
ALTER TABLE ............................................................................................................ 636
DROP TABLE............................................................................................................. 637
DROP DATABASE ...................................................................................................... 637
Zapytania manipulacji danymi........................................................................................ 638
INSERT ..................................................................................................................... 638
REPLACE .................................................................................................................. 638
DELETE..................................................................................................................... 639
UPDATE .................................................................................................................... 639
SELECT..................................................................................................................... 640
Poczenia ..................................................................................................................... 641
Indeksy .......................................................................................................................... 642
Niepodzielno operacji ................................................................................................. 644
PHP a relacyjne bazy danych ............................................................................................... 645
Interfejs MySQL jzyka PHP ........................................................................................... 645
Biblioteka sieciowa ........................................................................................................ 651
Wyodrbnianie bazy danych ........................................................................................... 658
Warstwa abstrakcji bazy danych............................................................................... 660
Konstrukcja klasy BD ............................................................................................... 660
Testowanie klasy BD ................................................................................................ 664

Rozdzia 18. PHP i PostgreSQL......................................................................................................667


PostgreSQL podstawy..................................................................................................... 668
Zapytania definicji danych.............................................................................................. 669
CREATE DATABASE................................................................................................... 669
CREATE TABLE.......................................................................................................... 669
ALTER TABLE ............................................................................................................ 672
DROP TABLE............................................................................................................. 673
DROP DATABASE ...................................................................................................... 673
Zapytania manipulacji danymi........................................................................................ 673
INSERT ..................................................................................................................... 673
DELETE..................................................................................................................... 674
UPDATE .................................................................................................................... 674
SELECT..................................................................................................................... 675

Spis treci

13

Interfejs PostgreSQL jzyka PHP ......................................................................................... 676


Biblioteka sieciowa.............................................................................................................. 683
Wyodrbnianie bazy danych................................................................................................. 687

Rozdzia 19. PHP i ODBC.................................................................................................................691


ODBC historia i przeznaczenie ........................................................................................ 692
Architektura ODBC............................................................................................................... 693
Standardy SQL............................................................................................................... 694
Instalacja PHP i ODBC w systemie Windows ....................................................................... 694
Instalacja ODBC i PHP w systemach z rodziny UNIX ............................................................ 695
Modu serwera Apache............................................................................................. 695
Interfejs ODBC jzyka PHP................................................................................................... 698
Funkcje poczeniowe .............................................................................................. 698
Funkcje manipulujce metadanymi........................................................................... 699
Funkcje obsugi transakcji ........................................................................................ 702
Funkcje dostpu do danych i kursory ....................................................................... 703
Najczstsze problemy .............................................................................................. 706
Wymagania dla pocze ODBC........................................................................................... 708
MS SQL Server .............................................................................................................. 708
MS Access..................................................................................................................... 710
Nawizywanie poczenia .................................................................................................... 711
Wyodrbnianie bazy danych................................................................................................. 713
Unified ODBC ................................................................................................................. 713
PEARDB ......................................................................................................................... 713
ADODB........................................................................................................................... 714
Metabase ...................................................................................................................... 715
Biblioteka sieciowa.............................................................................................................. 715

Rozdzia 20. Programowanie aplikacji nieserwerowych w jzyku PHP .........................................721


Czym jest GTK? ................................................................................................................... 721
Czym jest PHP-GTK? ............................................................................................................ 722
Jzyk PHP w wierszu polece .............................................................................................. 722
Konfiguracja dla systemu Linux ..................................................................................... 722
Biblioteka libedit ...................................................................................................... 722
Instalacja PHP-GTK ........................................................................................................ 723
Konfiguracja dla systemu Windows................................................................................ 724
rodowisko .............................................................................................................. 724
Instalacja PHP-GTK................................................................................................... 725
Automatyzacja zada........................................................................................................... 726
Format plikw dziennika NCSA CLFF .............................................................................. 727
Skrypt analizatora pliku dziennika ............................................................................ 728
cron ............................................................................................................................... 730
AT .................................................................................................................................. 731
Harmonogram zada systemu Windows................................................................... 731
Przyjmowanie parametrw wiersza polece ................................................................... 731
Skrypty interaktywne............................................................................................................ 732
Programowanie aplikacji z uyciem PHP-GTK ....................................................................... 734
PHP-GTK podstawy .................................................................................................... 734
Przykad program Hello World.................................................................................... 737
Interfejs graficzny aplikacji biblioteki sieciowej .............................................................. 739
Dodatkowe rda informacji ............................................................................................... 746

14

PHP4. Zaawansowane programowanie


Rozdzia 21. PHP i XML .................................................................................................................747
XML przegld .................................................................................................................. 748
Rodzina standardw XML............................................................................................... 750
XML a bazy danych ........................................................................................................ 751
SML..................................................................................................................................... 752
Konwersja dokumentu XML na format SML ................................................................... 752
XML i PHP............................................................................................................................ 754
Weryfikacja obsugi XML-a.............................................................................................. 754
Porwnanie interfejsw XML .......................................................................................... 755
SAX a DOM............................................................................................................... 756
PRAX a DOM i SAX.................................................................................................... 756
Model SAX ..................................................................................................................... 756
Obsuga SAX w jzyku PHP ....................................................................................... 758
SAX kod przykadowy ........................................................................................... 758
Model DOM.................................................................................................................... 764
Obsuga DOM w jzyku PHP ..................................................................................... 764
DOM kod przykadowy.......................................................................................... 766
Model RAX ..................................................................................................................... 775
Obsuga PRAX w jzyku PHP ..................................................................................... 776
XSL i XSLT ........................................................................................................................... 780
Sablotron ....................................................................................................................... 781
Instalacja i weryfikacja konfiguracji XSL......................................................................... 781
Instalacja w systemie UNIX ...................................................................................... 781
Instalacja w systemie Windows................................................................................ 781
XSL kod przykadowy ................................................................................................. 782

Rozdzia 22. Internacjonalizacja aplikacji ....................................................................................787


Internacjonalizacja pojcia.............................................................................................. 787
Internacjonalizacja ......................................................................................................... 788
Lokalizacja..................................................................................................................... 788
Obsuga jzyka ojczystego ............................................................................................. 789
Motywy internacjonalizacji aplikacji ..................................................................................... 789
W czym tkwi problem? ................................................................................................... 790
Cigi tekstowe..................................................................................................................... 790
Cigi statyczne .............................................................................................................. 791
Cigi dynamiczne ........................................................................................................... 791
Przechowywanie cigw ................................................................................................. 792
Wyodrbnienie danych tekstowych z programu ........................................................ 793
GNU Gettext ........................................................................................................................ 794
Gettext informacje podstawowe ................................................................................ 794
xgettext i inne narzdzia pomocnicze............................................................................. 795
Aktualizacja tumacze .................................................................................................. 798
Wady biblioteki Gettext .................................................................................................. 798
Obiektowe rozszerzenie systemu tumaczenia..................................................................... 799
Zalety podejcia obiektowego........................................................................................ 799
Korzystanie z obiektw i przeczanie jzykw ............................................................... 800
Konwersja istniejcych programw...................................................................................... 800
Program nieprzetumaczony ........................................................................................... 801
Tumaczenie programu................................................................................................... 801
Obiekty przystosowane do wielojzycznoci przekadu ........................................................ 804
Integracja klasy Wyjscie z aplikacj ..................................................................................... 806
Dalsze doskonalenie skryptu............................................................................................... 808
Wyraenia regularne ............................................................................................................ 808

Spis treci

15

Wielko liter....................................................................................................................... 810


Lokalne formaty daty i czasu ............................................................................................... 810
Pozyskiwanie dodatkowych informacji lokalizacyjnych funkcja localeconv()..................... 813
Sortowanie .......................................................................................................................... 816
Wasna funkcja porwnujca ......................................................................................... 817
Kodowanie znakw.............................................................................................................. 819
Zapisywanie locali.......................................................................................................... 819
Przegldarka a jzyk................................................................................................. 819
Reagowanie na konfiguracj przegldarki................................................................. 821
Cigi poszerzone ................................................................................................................. 825
Modu obsugi cigw poszerzonych w jzyku PHP......................................................... 826
Modu mod_mime serwera Apache................................................................................ 826
Przykad lokalizacji rzeczywistej aplikacji PHP Weather ................................................... 826

Rozdzia 23. Bezpieczestwo aplikacji PHP ...................................................................................831


Czym jest bezpieczestwo? ................................................................................................. 832
Zabezpieczanie serwera ...................................................................................................... 832
Zbrojenie serwera .......................................................................................................... 833
Monitorowanie systemu................................................................................................. 833
Monitorowanie powiadomie o nowych lukach .............................................................. 834
Najpowszechniejsze rodzaje zagroe ...................................................................... 834
Zabezpieczanie serwera Apache.......................................................................................... 836
Dyrektywa User.............................................................................................................. 836
Dyrektywa Directory ....................................................................................................... 837
Zbrojenie serwera Apache ............................................................................................. 838
Zabezpieczanie PHP ............................................................................................................ 839
Bezpieczestwo instalacji PHP w trybie CGI ................................................................... 839
Konfiguracja PHP ........................................................................................................... 840
Tryb bezpieczny.............................................................................................................. 843
Zabezpieczanie serwera MySQL .......................................................................................... 844
MySQL i uytkownik root ................................................................................................ 844
Sprztanie ..................................................................................................................... 845
Zarzdzanie uytkownikami baz danych MySQL ............................................................. 846
Kryptografia ......................................................................................................................... 847
Szyfrowanie jednokierunkowe ........................................................................................ 847
Szyfrowanie symetryczne ............................................................................................... 850
Szyfrowanie asymetryczne ............................................................................................. 852
Bezpieczestwo sieci komputerowej ................................................................................... 852
Modu mod_ssl serwera Apache .................................................................................... 853
Instalacja moduu mod_ssl w systemie Linux........................................................... 853
Instalacja moduu mod_ssl w systemie Windows..................................................... 854
Konfiguracja moduu mod_ssl .................................................................................. 854
Kiedy naley korzysta z pocze SSL?................................................................... 855
Bezpieczne programowanie ................................................................................................. 855
Zagroenia zwizane z dyrektyw register_global........................................................... 856
Kontrola danych wprowadzanych przez uytkownika ...................................................... 858
Zagroenia pynce z nieuprawnionego wykonania kodu HTML...................................... 859
Puapki dyrektywy include .............................................................................................. 859
Kilka porad .......................................................................................................................... 860
Dodatkowe rda informacji ............................................................................................... 861
Zabezpieczanie serwerw linuksowych .......................................................................... 861
Bezpieczne powoki (SSH) .............................................................................................. 861

16

PHP4. Zaawansowane programowanie


Tripwire .......................................................................................................................... 861
Zabezpieczanie Apache ................................................................................................. 862
Zabezpieczanie PHP....................................................................................................... 862
Zabezpieczanie MySQL .................................................................................................. 862
Kryptografia ................................................................................................................... 862
mod_ssl ......................................................................................................................... 863
Bezpieczne programowanie ........................................................................................... 863
Strony WWW powicone bezpieczestwu..................................................................... 863
Pozostae rda ............................................................................................................ 863

Rozdzia 24. Optymalizacja aplikacji PHP......................................................................................865


Waciwy jzyk..................................................................................................................... 865
Wyniki testw................................................................................................................. 866
Optymalizacja kodu PHP ...................................................................................................... 867
Profilowanie kodu .......................................................................................................... 867
Profilowanie skryptw PHP ....................................................................................... 867
Klasyfikacja wskich garde ........................................................................................... 871
Techniki optymalizacji.......................................................................................................... 871
Optymalizacja kodu........................................................................................................ 872
Analiza ptli.............................................................................................................. 872
Wykorzystanie szybszych funkcji............................................................................... 873
Wybr waciwego sposobu przekazywania danych wyjciowych .............................. 873
Wybr waciwego sposobu pobierania danych wejciowych.................................... 873
Minimalizacja liczby wywoa funkcji echo().............................................................. 874
Wykorzystanie optymalizatora Zend Optimizer.......................................................... 874
Buforowanie i kompresja danych wyjciowych ............................................................... 874
Przykad skryptu buforujcego wyjcie...................................................................... 875
Funkcje obsugujce buforowanie wyjcia ................................................................ 875
Buforowanie kaskadowe .......................................................................................... 877
Kompresja wyjcia skryptu PHP................................................................................ 877
Optymalizacja bazy danych ............................................................................................ 878
Analiza zapyta ........................................................................................................ 878
Szacowanie efektywnoci zapytania ......................................................................... 878
Optymalizacja tabel .................................................................................................. 883
Optymalizacja modelu danych .................................................................................. 883
Stosowanie indeksw .............................................................................................. 884
Optymalizacja zapyta SELECT................................................................................. 885
Optymalizacja zapyta INSERT ................................................................................. 885
Optymalizacja zapyta UPDATE ................................................................................ 886
Optymalizacja zapyta DELETE................................................................................. 886
Optymalizacja pocze ............................................................................................ 886
Optymalizacja wskazwki dodatkowe................................................................... 887
Buforowanie wynikw oblicze ....................................................................................... 887
Czym jest buforowanie? ........................................................................................... 888
Waga buforowania.................................................................................................... 888
Zalety buforowania ................................................................................................... 888
Wady buforowania .................................................................................................... 888
Oglna metodologia buforowania ............................................................................. 889
Wybr metody skadowania buforowanych danych ................................................... 890
Konwencje nazewnicze............................................................................................. 892
Kryteria poprawnoci................................................................................................ 892
Oprnianie bufora ................................................................................................... 893
Jakie dane powinny by skadowane w buforach wynikw? ...................................... 893
Optymalizacja interpretera PHP...................................................................................... 895

Spis treci

17

Rozdzia 25. Biblioteki rozszerze jzyka PHP.............................................................................897


Biblioteka PDF ..................................................................................................................... 898
Instalacja....................................................................................................................... 898
Korzystanie z biblioteki PDFlib ....................................................................................... 899
Macromedia Flash............................................................................................................... 903
Ming i LibSWF ................................................................................................................ 903
Korzystanie z biblioteki Ming.......................................................................................... 904
WAP i WML .......................................................................................................................... 912
A gdzie tu biblioteka? .................................................................................................... 913
Korzystanie z biblioteki HAWHAW .................................................................................. 914
Tworzenie dynamicznych rysunkw ...................................................................................... 918
Instalacja biblioteki GD .................................................................................................. 918
Korzystanie z biblioteki GD ............................................................................................ 919
Licznik odwiedzin wykonany za pomoc GD ................................................................... 921
Kod licznika odwiedzin ............................................................................................. 921

Rozdzia 26. System uprawnie uytkownikw ...........................................................................925


Definicja wymaga............................................................................................................... 925
Wymagania aplikacji ...................................................................................................... 926
Projektowanie aplikacji ........................................................................................................ 926
Projektowanie schematu bazy danych............................................................................ 927
Tabela Uzytkownik.................................................................................................... 927
Tabela Uprawnienie.................................................................................................. 927
Tabela UzytkownikUprawnienie ................................................................................ 927
Projektowanie warstwy poredniczcej .......................................................................... 927
Dostp do bazy danych ............................................................................................ 928
Klasa Uprawnienie ................................................................................................... 928
Klasa Uzytkownik ..................................................................................................... 928
Warstwa logiki aplikacji ............................................................................................ 929
Projektowanie warstwy prezentacji................................................................................. 930
Kodowanie aplikacji............................................................................................................. 931
Kod obsugi bazy danych ............................................................................................... 931
Klasa Uprawnienie......................................................................................................... 932
Klasa Uzytkownik ........................................................................................................... 934
Testowanie klas............................................................................................................. 938
uprawnienia.php....................................................................................................... 939
uzytkownikuprawnienia.php...................................................................................... 944
Wykorzystanie systemu uprawnie uytkownikw................................................................ 950
Kilka propozycji rozszerzenia systemu................................................................................. 951

Skorowidz..................................................................................................................................953

Programowanie obiektowe w PHP4


Programowanie zorientowane obiektowo (Object Oriented Programming) istnieje ju od kilku lat. Jego historia wie si z powstaniem jzykw Smalltalk oraz C++. Koncepcja programowania obiektowego zaowocowaa nastpnie powstaniem nowych jzykw, takich jak
Java czy Python. Gdy w gr wchodzi tworzenie skomplikowanych programw, takich jak
edytor tekstu czy te gra komputerowa, programowanie obiektowe nie jest zaledwie jedn
z opcji dostpnych programicie. Jest to obecnie standardowy sposb tworzenia skomplikowanych programw w sposb uatwiajcy ich rozwijanie i zwikszajcy poziom ich
skalowalnoci, stosowany zarwno w oprogramowaniu komercyjnym, jak i bezpatnym.
Usprawnienie mechanizmw obiektowych w PHP4 spowodowao znaczne oywienie w spoecznoci programistw PHP. Zaczli oni wykorzystywa zalety programowania obiektowego. W tym rozdziale przyjrzymy si technikom programowania obiektowego od podstaw,
pokazujc, jak rol odgrywaj one w PHP, a take wskazujc sposoby ich wykorzystania
w celu tworzenia eleganckich rozwiza w dziedzinie aplikacji WWW. Przyjrzymy si kilku
sposobom analizy oraz poytecznym praktykom programistycznym pozwalajcym na zwikszenie moliwoci powtrnego wykorzystania kodu, a take uproszczenia procesu dalszego
rozwoju programw. Zanim jednak zagalopujemy si za daleko, zobaczmy, w jaki sposb
powstaa koncepcja programowania obiektowego, a take czym rni si ona od tradycyjnych technik programowania proceduralnego. Jeli jeste dowiadczonym programist stosujcym techniki obiektowe i chcesz zapozna si z zagadnieniami obiektowymi specyficznymi dla PHP, moesz od razu przej do podrozdziau Klasy.

Programowanie zorientowane obiektowo


Na pocztku przeledmy rnice pomidzy programowaniem obiektowym a klasycznym
programowaniem proceduralnym. Przed powstaniem idei programowania obiektowego
programy staway si coraz bardziej rozbudowane i skomplikowane. Systemy te dla dalszego
rozwoju wymagay pracy wielu architektw i inynierw, a proces ten pochania coraz wicej czasu i pienidzy. Czsto zachodzi potrzeba dopasowania oprogramowania do zmian
w strategii biznesowej. W takim przypadku zmiana istniejcych funkcji programu lub dodanie nowych wymagay tygodni, a czsto miesicy pracy i okazywao si, e napisanie
programu od nowa trwaoby znacznie krcej.

126

PHP4. Zaawansowane programowanie


Aplikacje rozrastay si, a usuwanie bdw w nich stawao si powanym problemem.
Wysiki w celu utrzymania istniejcych moliwoci systemu zajmoway wicej czasu ni
dodawanie nowych funkcji. Kod stawa si coraz bardziej chaotyczny, poniewa rosa liczba
pracownikw zaangaowanych w projekt. Bdy projektowe popenione na pocztku (co
czsto ma miejsce w przypadku projektw programistycznych prowadzonych w jzykach
takich jak Fortran czy C) byy czsto przyczyn nawarstwiania si problemw. W wielkich
firmach, inwestujcych ogromne pienidze w systemy informatyczne niezbdne do prowadzenia biznesu, uwiadomiono sobie ogromn potrzeb usprawnienia procesu projektowania i tworzenia oprogramowania.
Wtedy wanie naukowcy z wielu dziedzin, takich jak informatyka, filozofia czy biologia,
stworzyli podstawy nowego sposobu tworzenia oprogramowania, ktry zosta ostatecznie
nazwany programowaniem zorientowanym obiektowo. W procesie tym najbardziej zasuyli si Alan Kay, twrca jzyka Smalltalk, oraz Grady Booch, autor nowoczesnych zasad
analizy i programowania obiektowego.
Celem tych prac byo zaegnanie kryzysu w przemyle programistycznym przez stworzenie
atwego w uyciu zestawu narzdzi programistycznych. Wspomniani pionierzy techniki
obiektowej odkryli, e rozwizanie problemw programistycznych jest moliwe przez zastosowanie kilku nowych zasad tworzenia oprogramowania, wymagajcych od programisty
nieco wicej wysiku na pocztku pracy. Programowanie obiektowe zmusza programist do
spojrzenia na problemy i sposoby ich rozwizania z nieco innej perspektywy. Kosztem zastosowania technik obiektowych jest niewielkie zmniejszenie wydajnoci oprogramowania,
ale jego dalsza rozbudowa staje si niezwykle atwa.
Oczywista jest konieczno kompromisu pomidzy wydajnoci i atwoci rozbudowy.
W przypadku niektrych systemw komputerowych, w ktrych krytycznym czynnikiem
jest dziaanie w czasie rzeczywistym lub te ktre wykorzystuj operacje wymagajce bardzo duej wydajnoci, zastosowanie rozwiza obiektowych nie wchodzi w gr wanie
z powodu wymaga dotyczcych czasu wykonania. Jednak wszdzie tam, gdzie zastosowanie programowania obiektowego jest uzasadnione, programista moe tworzy programy
w sposb niezwykle elastyczny i o wiele bardziej intuicyjny ni do tej pory. Programowanie zorientowane obiektowo wspomaga tworzenie oprogramowania w sposb uatwiajcy
ponowne wykorzystanie kodu, rozbudow, wykrywanie bdw i zwikszajcy czytelno
programw.
Wraz z rozwojem technik obiektowych powstaway nowe metodologie prowadzenia projektw informatycznych, takie jak osawione programowanie ekstremalne (eXtreme Programming) czy te ujednolicony proces (Unified Process). atwiej jest obecnie planowa
fazy projektw, gospodarowa zasobami, wtrnie wykorzystywa istniejcy kod, a take
testowa i analizowa kod w wikszych projektach. Faktem jest, e powstanie technik programowania obiektowego miao ogromny wpyw na nasz dzisiejszy, oparty na elektronice
wiat. Technologie takie jak Java wykorzystuj techniki obiektowe do granic moliwoci,
udostpniajc pojedyncze, zorientowane obiektowo rozwizanie przeznaczone dla rnych
platform, poczwszy od urzdze elektronicznych codziennego uytku, poprzez oprogramowanie dla komputerw klasy PC, na potnych aplikacjach internetowych skoczywszy.

Rozdzia 5.

Programowanie obiektowe w PHP4

127

Programowanie proceduralne a programowanie obiektowe


A zatem co powoduje, e programowanie obiektowe tak rni si od programowania proceduralnego? Gdy tworzymy oprogramowanie przy uyciu procedur (funkcji), tworzymy
programy zorientowane na kod. Programy wywouj funkcje, ktre wywouj funkcje
i tak dalej. Dane s przesyane jako argument wywoania funkcji, funkcja dokonuje modyfikacji danych i zwraca odpowiednie wyniki. Programowanie zorientowane obiektowo to
zupenie inna metodologia. Tutaj programowanie jest zorientowane na dane. Obiekty, ktre
wewntrznie reprezentuj dane, zawieraj dodatkowo mechanizmy funkcji, zwanych w tym
przypadku metodami.
Metoda jest usug (w swej implementacji niezwykle podobn do funkcji), ktr obiekt
udostpnia swoim klientom (innym obiektom). Gdy obiekt wysya danie usugi do drugiego
obiektu, odbywa si to na zasadzie przesania komunikatu i uzyskania odpowiedzi. Oto porwnanie obydwu metod:
Model proceduralny
wejcie

a()

Model obiektowy

wywoanie

b()

wynik

wynik

wywoanie
c()

m
Obiekt 1

Obiekt 2

Obiekt 3

Obiekt 4

wyjcie

Wprowadzenie danych powoduje wywoanie funkcji , ktra wywouje funkcj .
Funkcja  wywouje , ktra zwraca swj wynik do , ktra z kolei zwraca swj wynik funkcji . Funkcja  ostatecznie generuje wynik programu. Funkcja  w typowym
programie w  nosiaby nazw . W modelu obiektowym obiekt wysya dania usug
do innych obiektw, co wida na przykadzie. Tutaj 
 wysya danie do 
.
Z kolei 
 wysya danie do 
 i tak dalej, a do momentu, gdy 

uzyska odpowied od 
 zawierajc wynik kocowy.
Ten mechanizm opiera si na udostpnianiu usug obiektom przez inne obiekty celem przekazywania informacji niezbdnej do ich pracy. Oznacza to moliwo podejmowania decyzji na podstawie informacji uzyskanych z innych obiektw. Przekazywanie komunikatw
stanowi samo w sobie przebieg programu. Dane i metody, a take sam kod implementujcy
obiekty, s zgromadzone w jednym centralnym miejscu.
Rnica pomidzy tymi dwoma sposobami polega na tym, e obiekty zawieraj cae dane
oraz mechanizmy dziaania, ktre powinny by ze sob zwizane, natomiast w rozwizaniu
proceduralnym dane i mechanizmy dziaania istniej niezalenie od siebie. Cecha ta pozwala
na atw analiz kodu wykorzystujcego technik obiektow i zwiksza modularno projektu.
Nie oznacza to jednak, e programy wykorzystujce rozwizanie proceduralne nie daj si
atwo rozwija. Wymaga to jednak znacznie wicej uwagi i organizacji ze strony programisty, aby zapewni odpowiednie umiejscowienie wszystkich elementw. Najlepsz rzecz

128

PHP4. Zaawansowane programowanie


w programowaniu obiektowym jest to, e tworzone obiekty maj sens w projekcie, opieraj
si na jasnych zaoeniach, dziki czemu wszystko wydaje si by dobrze zorganizowane.
W bardziej skomplikowanych projektach mona wykorzysta wyspecjalizowane rozwizania, ktre dodatkowo usprawni projekt naszego systemu, zapewniajc dodatkowe korzyci.

Znaczenie programowania obiektowego


Programista musi sobie uwiadomi, e programowanie obiektowe jest czym wicej ni
technik programistyczn. Nie jest to jzyk ani platforma systemowa. PHP, C++ czy Java
s jzykami obiektowymi, poniewa wykorzystuj to samo rozwizanie, cho kady z nich
realizuje to na swj unikalny sposb. Nie zmienia to faktu, e programowanie w C++ rni
si do znacznie od programowania w PHP, poniewa jzyki te rni si skadni oraz
dziaaniem konstrukcji jzykowych.
Jednak poniewa jzyki zorientowane obiektowo s skonstruowane wg podobnych zasad,
podstawy programowania obiektowego we wszystkich tych jzykach s podobne. Dlatego
naley najpierw nauczy si podstaw samych koncepcji obiektowych, aby nastpnie zagbi si w szczegy implementacji tych technik w wybranym jzyku programowania. Przy
bliszej obserwacji okazuje si, e PHP obsuguje jedynie podzbir cech oczekiwanych od
obiektowego jzyka programowania. Ograniczenia PHP w tej dziedzinie zostan omwione
w dalszej czci tego rozdziau, a pod koniec rozdziau przedstawimy ich podsumowanie.

Zstpujca metoda tworzenia oprogramowania


Od czasw powstania nauki ludzie wykazuj skonno do dzielenia na kategorie, definiowania i formalizowania wszystkiego, co istnieje na wiecie. Programowanie nie jest tu wyjtkiem, poniewa informatyka wyrasta z silnych korzeni matematyki i logiki. Pikno programowania obiektowego polega na tym, e pozwala ono nie tylko umieci dane i kod na
swoim miejscu, ale rwnie umoliwia podzielenie na kategorie i zdefiniowanie elementw
programw w sposb, w jaki postrzegamy elementy naszego wiata. Technika ta umoliwia
kompleksowe opracowanie projektu, zanim zagbimy si w szczegy. Pozwala to na atwe
oszacowanie czasu, zagroe i rnych zasobw, ktre maj zwizek z naszym projektem.
Gdy tworzymy program, moemy podzieli go na wyspecjalizowane czci lub moduy.
Moemy na przykad wyodrbni rne warstwy prezentacji, warstw dostpu do bazy danych, mechanizmy wyszukiwania czy te komponenty odpowiedzialne za bezpieczestwo.
Gdy tworzymy nasze moduy jako wyodrbnione elementy, zyskujemy pewno, e zmiany
dokonane w jednym z obiektw nie bd miay wpywu na drugi. Dodatkowo bdziemy
mogli ponownie wykorzysta obiekty w innych aplikacjach. Moemy rwnie z atwoci
rozbi nasze moduy na podmoduy, a w kocu na pojedyncze klasy, ktre stanowi najmniejszy komponent w programowaniu zorientowanym obiektowo. Przyjrzyjmy si teraz
temu najmniejszemu komponentowi w programie zorientowanym obiektowo, czyli klasie.

Rozdzia 5.

Programowanie obiektowe w PHP4

129

Klasy
Klasa jest definicj reprezentacji okrelonego typu danych. Klasy su jako sposb modelowania rnych typw danych w naszym systemie. Gdy chcemy utworzy obiekt, najpierw
uyjemy sowa kluczowego , aby zdefiniowa go, zanim uyjemy go w naszym skrypcie
w PHP. Rnica pomidzy klas a obiektem polega na tym, e klasa definiuje obiekty uywane
w programie. Zanim dowiemy si, w jaki sposb tworzy klasy, musimy zacz myle
o klasach jak o reprezentacji pojedynczej idei. W trakcie projektowania klasy trzeba stara
si, aby realizowaa konkretny cel w sposb jak najbardziej kompletny, nie wykraczajc
jednak poza przeznaczenie przypisane tej idei.
Klasa w PHP skada si z trzech gwnych elementw: atrybutw (reprezentujcych dane),
metod oraz konstruktorw. Atrybut stanowi porcj danych przechowywanych przez obiekt.
Obiekty mog zawiera dowoln liczb atrybutw na przykad jeli chcielibymy przedstawi samochd w postaci klasy, kierownica i skrzynia biegw byyby atrybutami klasy
. Metody okrelaj usugi, ktre obiekt udostpnia swoim klientom w celu manipulowania atrybutami. Przykadowo klasa  moe udostpnia metody umoliwiajce wykonanie manewru skrtu pojazdem, wykorzystujc wewntrzny atrybut reprezentujcy kierownic.
Konstruktor jest specjaln metod inicjujc obiekt do stanu gotowoci. W PHP w kadej
klasie moe by zdefiniowany tylko jeden konstruktor. W klasie  sensowne wydaje
si dodanie atrybutw 
,  , ,  
, 

 i tym podobne.
Gdy klient zechce uy metod obiektu, konstruktor zapewnia, e kada z metod bdzie
dziaa na prawidowych atrybutach i zwrci oczekiwany wynik, na przykad aby mona
byo wczy radio w samochodzie, musi by ono zamontowane. W tym przypadku konstruktor jest odpowiedzialny za zamontowanie radia przed jego uyciem.
Oprcz realizowania funkcji inicjowania obiektu do stanu gotowoci, dodatkow rnic
midzy konstruktorami a metodami jest to, e konstruktory nie zwracaj jawnie adnych
wartoci. Kady konstruktor zwraca nowo zainicjowany obiekt, gotowy do uycia w programie. Dlatego uycie instrukcji 
 w definicji konstruktora jest nielegalne. W dalszej czci rozdziau zajmiemy si szerzej problematyk wykorzystania obiektw w programach.
Czsto spotykanym problemem jest konieczno opracowania prawidowego projektu
obiektw i konstruktorw. Jeli konstrukcja klasy zmusza programist do rcznego inicjowania atrybutw przed ich uyciem lub te zachowania okrelonej kolejnoci inicjowania
atrybutw, prowadzi to do powstania zagmatwanego i nieczytelnego kodu. Programowanie
zorientowane obiektowo pozwala unikn takich sytuacji. Jeli klasa zostanie zaprojektowana w sposb nie wykorzystujcy konstruktora do inicjacji kluczowych atrybutw, projekt taki uznajemy za nieprawidowy. Uwaaj, aby nie wpa w t puapk.
Dobrze zaprojektowana klasa moe nam zaoszczdzi wielu problemw w trakcie programowania, usuwania bdw i rozwijania projektu.

Przyjrzyjmy si oglnej skadni definicji klas w PHP, demonstrujcej wykorzystanie trzech


typw komponentw:

130

PHP4. Zaawansowane programowanie


 
   
  








  
!" 
#$
%
!"& #$
%
!"& #$
%

!"& #$
%
%

Jak wida, klasa jest po prostu zestawem definicji atrybutw (zmiennych) i metod (funkcji).
Atrybuty mog by zmiennymi typw prostych, takich jak liczby czy napisy, lub bardziej
zoonych, jak tablice czy inne obiekty. Poniewa PHP nie wymaga definicji typw, wystarczy po prostu wymieni nazwy atrybutw na pocztku definicji klasy, tak jak w powyszym przykadzie.
PHP umoliwia tworzenie nowych atrybutw w metodach w trakcie wykonania programu
i bd one dziaa prawidowo. Jest to jednak uwaane za zy nawyk programistyczny. Inni
programici powinni podczas analizy kodu pozna wszystkie atrybuty klasy na podstawie
definicji klasy bez koniecznoci zagbiania si w szczegy implementacji metod.
Metody stanowi wszelkie usugi udostpniane przez t klas jej klientom. Klientami mog
by inne programy, obiekty, skrypty itd.
Utwrzmy kod dla klasy . W tym przykadzie rozpoczynamy definicj klasy, uywajc sowa kluczowego . Za dobr praktyk programistyczn uwaa si rozpoczynanie
wszystkich nazw klas z wielkich liter, w celu odrnienia ich od nazw zmiennych i funkcji.
Programici przestrzegaj tej zasady od lat. Dziki temu atwo jest odrni konstruktor od
innych metod w klasie. Innym dobrym zwyczajem jest nazywanie plikw tak samo, jak
klasy, na przykad Samochod.php. Pojedynczy plik powinien zawiera definicj tylko jednej klasy. Jeli masz wiele klas odwoujcych si wzajemnie do siebie tworz kolekcj
klas, powiniene umieci je w katalogu gwnym swojej aplikacji. W przypadku duych
projektw taki zwyczaj staje si wymogiem.
Gdy projekt si rozronie, konieczne stanie si wykorzystanie struktury drzewiastej
w celu przechowywania klas wykorzystywanych w aplikacji. Bdziesz zmuszony do wykorzystania dyrektyw include_once() lub require_once(), aby wczy pliki definicji tych
klas do swoich skryptw.

Rozdzia 5.

Programowanie obiektowe w PHP4

131



 





W nieprawdopodobnie prostym modelu samochodu klasa skada si z silnika i stacyjki rozrusznika sucej do uruchomienia pojazdu. Prawdziwy samochd bdzie skada si z nadwozia,
drzwi, pedaw gazu, sprzga, hamulca, kierownicy, skrzyni biegw i wielu, wielu innych
elementw. W naszym przypadku chodzi jednak jedynie o demonstracj:
 



Nasz samochd rwnie posiada konstruktor inicjujcy silnik i stacyjk. Gdybymy nie
zainicjowali tych elementw, kade uycie metod    lub   zakoczyoby si
bdem. Jak wspomnielimy wczeniej, zadaniem konstruktora jest zainicjowanie wszystkich
elementw obiektu w celu zapewnienia, e wszystkie usugi bd mogy zosta wykorzystane wtedy, gdy bd potrzebne.
Aby odwoa si do atrybutu, naley uy konstrukcji   ! przed nazw atrybutu. Jest to
rnica w porwnaniu z Jav i C++, gdzie takie odwoanie do obiektu klasy jest opcjonalne. PHP wymaga tego zapisu, poniewa jzyk ten nie jest dobrze wyposaony w obsug
zakresw widzialnoci zmiennych. W PHP istniej trzy poziomy przestrzeni nazw, w ktrych przechowywane s zmienne (przestrze nazw jest, oglnie rzecz biorc, kolekcj nazw
zmiennych).
Na najniszym poziomie wystpuje przestrze nazw uywana w celu przechowywania lokalnych zmiennych funkcji i metod. Kada zmienna definiowana na tym poziomie jest dodawana do lokalnej przestrzeni nazw. Kolejna przestrze nazw zawiera atrybuty obiektw.
Przestrze nazw najwyszego poziomu jest uywana do przechowywania zmiennych globalnych. Konstrukcja   ! wskazuje, e odwoujemy si do zmiennej z przestrzeni nazw
obiektu (rodkowa warstwa). Jeli zapomnisz zastosowa zapis   !, utworzysz zupenie now zmienn w lokalnej przestrzeni nazw. Poniewa bdzie ona odwoywa si do zupenie innej wartoci, mog powsta trudne do wychwycenia bdy logiczne.
Koniecznie uaktywnij opcj raportowania bdw, ktr omwimy w nastpnym rozdziale.
Dodatkowo dodaj kilka asercji, aby zabezpieczy si przed tym bdem, tak powszechnym przy pracy z klasami.

Metoda    uruchomi samochd uytkownikowi posiadajcemu kluczyk, jeli kluczyk


ten jest waciwy.
 
 

 
 

 !
"#$%$ 

 ! "#$ 
&

  
'
 
' !# !


132

PHP4. Zaawansowane programowanie


 !  !
##
&
# #
&

Metoda   sprawdza, czy silnik dziaa, i jeli tak, zatrzymuje samochd. Zauwamy, e
sprawdzenie stanu uruchomienia samochodu mogoby zosta przeniesione do metody  
obiektu silnika, co zwolnioby nas z koniecznoci obsugi tego przypadku. Projektujc klasy,
czsto napotkasz takie rozterki dotyczce umiejscowienia logiki obiektw. Podejmowanie
waciwych decyzji projektowych jest podstaw dobrego i skutecznego tworzenia aplikacji.

  

 !  !
#
 !  ! 
&
&
## (')  *)+,
('
&
!

Teraz przedstawimy, w jaki sposb mona stosowa obiekty w programach.

Obiekty
Obiekt w programie jest egzemplarzem klasy. Obiekty nazywamy egzemplarzami, poniewa mona utworzy wiele obiektw (czyli egzemplarzy) tej samej klasy tak jak na drodze moe by wiele samochodw tego samego typu. Aby utworzy dwa nowe samochody,
musimy wykona nastpujce dwa wiersze kodu:


 -"#$
 

 ."#$
 

W celu utworzenia nowego egzemplarza klasy (to znaczy utworzenia obiektu) uywamy
sowa kluczowego 
. Odwoania do nowo utworzonych obiektw zostaj umieszczone
w zmiennych  oraz ". Mamy wic dwa obiekty samochodw, ktrych
moemy uy. Gdybymy chcieli utworzy dziesi samochodw, moglibymy uy tablicy
obiektw:

 "
 "/-/00

 12"#$
 
&

Gdy zechcemy uruchomi samochd, wywoujemy jego metod    w nastpujcy


sposb:

 3
  "
 !  
'

 3
  #
 4
5 ' )
   4

Rozdzia 5.

Programowanie obiektowe w PHP4

133

A gdy zechcemy zatrzyma samochd, piszemy:



 ! 
!

Zauwa, e interfejs naszego obiektu jest atwy w uyciu. Nie musimy martwi si o to, jak
zosta zaimplementowany. Jako programista musisz tylko zna serwisy udostpniane przez
obiekt. Ten program mgby z powodzeniem sterowa procesem uruchamiania i zatrzymywania silnika prawdziwego samochodu. Szczegy kryjce si za metodami, a take atrybutami mog pozosta zupenie nieznane. Koncepcja tworzenia atwych w uyciu obiektw
doprowadza nas do tematu nastpnego podrozdziau, czyli hermetyzacji. Na razie zajmiemy
si jednak tworzeniem egzemplarzy obiektw z wykorzystaniem metod fabrycznych.

Metody fabryczne
Czasem wygodniej jest poprosi obiekt o utworzenie innego obiektu, zamiast samemu wywoywa konstruktor. Klasy udostpniajce takie usugi nazywamy klasami fabrycznymi,
a metody uywane do tworzenia obiektw nazywamy metodami fabrycznymi. Okrelenie
fabryczny wywodzi si ze skojarzenia z fabryk instytucj wytwarzajc gotowe wyroby.
Na przykad fabryk silnikw General Motors, produkujc silniki do samochodw, mona
porwna z obiektem fabrycznym tworzcym obiekty okrelonego typu. Nie zagbiajc si
w szczegy zaawansowanych technik obiektowych, zademonstrujemy teraz moliwe zastosowanie obiektw fabrycznych w tworzeniu aplikacji WWW. Mona je zastosowa do:


zdefiniowania obiektu tworzcego elementy formularzy (takie jak pola tekstowe,


grupy opcji, przyciski formularzy itd.) celem umieszczenia go w formularzu
HTML. Klasa ta bdzie realizowa zadania analogiczne do zada klasy dostpnej
w ramach biblioteki eXtremePHP (dostpnej na stronie http://www.extremephp.org/);

zdefiniowania obiektu fabrycznego wstawiajcego do tabeli bazy danych nowe


wiersze i zwracajcego odpowiedni obiekt dostpu do danych zawartych w tym
konkretnym wierszu.

Przyjrzyjmy si teraz sposobowi definiowania klas fabrycznych na przykadzie tworzenia


obiektw #
$
 
oraz # # 

 z poziomu klasy % &


% (zapoyczonej z biblioteki eXtremePHP).
W przykadzie wykorzystujemy dwa pliki zawierajce klasy. Zakadamy, e zostay one
utworzone wczeniej. Plik PoleTekstowe.php zawiera kod definiujcy klas #
$
 
,
natomiast Przycisk.php zawiera kod klasy # . Konstruktory tych klas wymagaj
podania nazwy i wartoci tworzonego elementu:


 #6 
#4 7 #8# $# 4

 #6 
#4 7'
 4

Dobrym zwyczajem programistycznym jest dodawanie przyrostka Factory na kocu nazwy klasy. Zachowanie tej konwencji, stosowanej powszechnie w rodowisku programistw wykorzystujcych techniki obiektowe, pozwoli innym programistom na pierwszy rzut
oka zidentyfikowa zadanie klasy:

134

PHP4. Zaawansowane programowanie


9 ##:  ':
  

9 ##:  ':


 


Nasz pierwsz metod fabryczn jest  #


$
 
. Metoda ta po prostu tworzy
pole tekstowe, przekazujc parametry  oraz   przekazane przez klienta.

 $ '7 #8# $#'$($ 


##$7 #8# $#'$($ 

&

Metoda  #  zostanie zdefiniowana w podobny sposb. Warto uywa podanej


przez nas (lub podobnej) konwencji nazywania metod fabrycznych (przedrostek  ),
aby jednoznacznie zasygnalizowa innym programistom, e przeznaczeniem metody jest
utworzenie nowego obiektu. Taka praktyka ujednolici terminologi w tworzonych aplikacjach i polepszy przejrzysto kodu.

 $ '7'
'$($ 


##$7'
'$($ 

&
&

Teraz zamiast tworzy egzemplarze klas #


$
 
oraz # za pomoc operatora

, moemy skorzysta z obiektu klasy &

 %% , aby dokona tego za nas:
*9 ## $:  '"#$9 ##:  ':
 
 #8# $#;#"
*9 ## $:  ' !$ '7 #8# $#<#<(<=<
 #8# $#>'$ "
*9 ## $:  ' !$ '7 #8# $#<'$ <(< $ <
'
%$# '"
*9 ## $:  ' !$ '7'
<'$# '<(<%$# ?,
'$ <
!

Utworzylimy egzemplarz klasy &



 %% , a nastpnie utworzylimy trzy
nowe obiekty z uyciem metod obiektu fabrycznego. Pierwsze dwa wywoania metody
 #
$
 
 powoduj utworzenie pl tekstowych do wpisania imienia i nazwiska. Wywoanie metody  #  powoduje utworzenie przycisku z napisem
' 
( )   . W tym momencie nasza aplikacja moe wykorzysta utworzone obiekty do dowolnych celw. Nie chodzio nam jednak o znaczenie aplikacji, lecz
o zastosowanie obiektw fabrycznych w aplikacjach internetowych.
Klasy fabryczne nie ograniczaj si jedynie do udostpniania metod tworzcych obiekty.
Mona swobodnie dodawa metody, ktre wydaj si zasadne w modelu fabrycznym, takie
jak metody wyszukujce obiekty w naszej fabryce czy metody usuwajce, ktre umoliwiaj pozbywanie si obiektw z zasobw fabryki. Decyzje dotyczce takich metod s cile uzalenione od projektu i zale wycznie od projektanta aplikacji. Teraz przyjrzyjmy
si zasadom hermetyzacji i ukrywania informacji.

Rozdzia 5.

Programowanie obiektowe w PHP4

135

Hermetyzacja (ang.Encapsulation)
Gdy zaywasz rodek przeciw blowi gowy, zwykle nie wiesz, z czego si skada. Jedyne,
co Ci interesuje, to jego dziaanie polegajce na usuniciu blu gowy. W podobny sposb
programici wykorzystuj obiekty. Gdy stosowalimy obiekt klasy , nie wiedzielimy niczego o jego skrzyni biegw, ukadzie wydechowym czy te silniku. Chcielimy tylko
przekrci kluczyk i uruchomi samochd. Umoliwienie takiego wykorzystania obiektu
powinno sta si gwnym celem jego projektanta.
Wszelkie skomplikowane dane i logik obiektu naley ukry wewntrz obiektu, udostpniajc jedynie wane usugi suce do posugiwania si obiektem. W ten sposb dokonujemy
hermetyzacji skomplikowanych danych i szczegw implementacyjnych wewntrz obiektu.
Jeli dokonamy tego waciwie, osigniemy dodatkowy zysk w postaci ukrycia informacji.
Jak wspomnielimy wczeniej, niewiadomo istnienia oraz rodzaju atrybutw danych
przechowywanych w strukturze klasy moe stanowi korzy dla wykorzystujcych j programistw.
Mimo e modyfikacja atrybutw obiektu jest poprawn operacj w PHP, jest to uznane
za zy nawyk programistyczny.

Zademonstrujemy kilka moliwych sytuacji, do ktrych moe doprowadzi modyfikacja


atrybutw obiektu bez korzystania z porednictwa interfejsu obiektu. W naszym przykadzie zakadamy, e istnieje metoda ustalajca prdko samochodu o nazwie #
 

 , ktra kontroluje przekroczenie prdkoci 200 km/h, a take sprawdza, czy
prdko nie jest mniejsza od zera. Zamy rwnie, e konstruktor nie zainicjowa silnika
i stacyjki:
  
'"#$ 
'< 
' 7 '<

 "#$
 

 ! "#$ 

 !#  
"@//

 !  
'

 ! "/

 ! 

Powyszy kod zawiera wiele bdw, ktre w konsekwencji spowoduj bd interpretera


lub, co gorsza, spowoduj, e program bdzie dziaa nieprawidowo. W pierwszych trzech
wierszach nie utworzylimy kluczyka pasujcego do naszego samochodu, poniewa nie skorzystalimy z naszego konstruktora.
Kluczyk nie jest potrzebny przed uruchomieniem samochodu, wic nie pojawi si adne
bdy. Nastpnie przyjrzyjmy si fragmentowi, w ktrym tworzymy obiekt klasy  .
Co staoby si, gdybymy zamiast tego fragmentu wpisali  ! * 
 
  (zwr uwag na wielk liter w bdnej nazwie atrybutu  )? Samochd rwnie nie dziaaby prawidowo, poniewa silnik nie zostaby zainicjowany. Oczywicie, bdy
tego typu mona atwo odnale i usun, ale nie powinny si one w ogle pojawi. Nastpnie usiujemy uruchomi samochd:

136

PHP4. Zaawansowane programowanie



 !#  
"@//*' '))  ( $ABC

 ! 7#  
@//

 !  
'

Gdy samochd zostanie uruchomiony, wystartuje z prdkoci 400 km/h. Moe to spowodowa wypadek i mier wielu uytkownikw ruchu drogowego. Oczywicie, nie chcemy
dopuci do wystpienia takiej sytuacji.
Skd samochd wie, jaki rodzaj kluczyka jest wymagany do jego uruchomienia? W tym
celu porwna nasz poprawnie skonstruowany kluczyk ze zmienn, ktra nie istnieje (co
w wyniku daje warto +) i w konsekwencji spowoduje, e samochd nie uruchomi silnika.
Taki bd nie zostanie wykryty przez interpreter, poniewa porwnujemy zmienn   ,
nie kontrolujc przynalenoci do klasy. Dziwn sytuacj byoby zakupienie nowiutkiego
samochodu od dealera tylko w celu sprawdzenia, e kluczyk nie wsppracuje ze stacyjk.
Na kocu sprawdmy, co moe si sta, gdy przypiszemy warto + atrybutowi  :

 ! "/

 ! 

Gdy wywoywana jest metoda  , zostaje wywoany bd wykonania, poniewa atrybut
 klasy  nie jest obiektem klasy  , gdy wymusilimy zmian wartoci
atrybutu  na +. Jak wida, przypisywanie wartoci atrybutom bez porednictwa
metod klasy moe spowodowa wiele problemw. Gdy nad projektem pracuje wielu programistw, naley przewidzie sytuacj, w ktrej Twj kod bdzie czytany, a nawet uywany przez innych programistw.
Jaka nauka pynie z powyszego przykadu? Uywanie atrybutw obiektu bezporednio
moe mie nastpujce konsekwencje:


brak kontroli wykorzystania atrybutw w przewidywalny sposb;

naruszenie integralnoci atrybutw obiektu (lub stanu obiektu) w jeden


z nastpujcych sposobw:


pogwacenie zasad okrelajcych poprawne wartoci danych;

pominicie inicjacji atrybutw;

tworzenie zbyt skomplikowanych interfejsw;

zmuszenie programisty do zapamitania wikszej liczby informacji na temat


powiza atrybutw z metodami;

w przypadku ponownego wykorzystania obiektu moe pojawi si potrzeba


modyfikacji atrybutw. Moe to doprowadzi do ponownych bdw podczas
tworzenia nowego projektu, a wanie tego chcielibymy unikn.

Dobr zasad jest takie zaprojektowanie klasy, aby udostpniaa usugi realizujce
wszelkie operacje na obiekcie. Naley unika bezporedniej modyfikacji atrybutw
obiektu z zewntrz i zawsze stosowa techniki hermetyzacji danych, aby wykorzysta
zalety ukrywania informacji. Niektre jzyki oferuj techniki blokowania dostpu do
atrybutw obiektw z zewntrz przez deklarowanie ich jako prywatne (private) lub chronione (protected). W obecnej implementacji PHP nie obsuguje adnej z tych technik,
ale na pewno pomocne okae si przestrzeganie ustalonych zasad programistycznych.

Rozdzia 5.

Programowanie obiektowe w PHP4

137

Dziedziczenie
Zapoznalimy si ju z podstawowymi elementami programowania zorientowanego obiektowo i z niektrymi jego dobrymi praktykami. Nadszed czas, aby zapozna si z mechanizmami udostpnianymi przez programowanie obiektowe, pozwalajcymi na podejmowanie
przejrzystych strategii rozwizywania skomplikowanych problemw.
Zamy, e naszym celem jest uporzdkowanie i zarzdzanie sklepem internetowym typu
amazon.com. Chcielibymy sprzedawa pyty CD, oprogramowanie, kasety VHS, pyty DVD
oraz ksiki. Korzystajc z tradycyjnych rozwiza opartych na funkcjach, moemy utworzy tradycyjn struktur do przechowywania informacji o tych mediach, na przykad:
Medium
id
nazwa
typ
wMagazynie
cena
ocena

Oczywicie, istnieje mnstwo rnic pomidzy ksikami, filmami, pytami CD i oprogramowaniem, wic zechcemy utworzy dodatkowe struktury przechowujce dane dla okrelonych typw medium:
PlytaCD
numerSeryjny
artysta
liczbaUtworow
nazwyUtworow

Oprogramowanie
numerSeryjny
wydawca
platforma
wymagania

Film
numerSeryjny
czasTrwania
reyser
obsada
typ

Ksiazka
ISBN
autor
liczbaStron

Aby napisa program wypisujcy elementy tablicy zawierajcej nasze media, zastosujemy
nastpujcy kod:

* 
'$#D
.# ##
# ##"
'"
 E "
# ## ! "-
# ## !"4'4
# ## !'$"47 + $#$7F7@  #  5$4
# ## !$G+'#"HH
# ## !
#"@I IJ
# ## !
#"J
# ##12"# ##
' !*"-.@KJH@H@H@@H
' ! "4#9+#(4
' ! 
'* "J//
'1# ## ! 2"'

138

PHP4. Zaawansowane programowanie


# ## ! ".
# ## !"4
4
# ## !'$"48L4
# ## !$G+'#"-./
# ## !
#"-K IJ
# ## !
#"@
# ##12"# ##

!##"H.H.J@HJ@

!"4=#$# 4

! 
'*3$  $"-H
 E 1# ## ! 2"

$## ##5$'* 

 #
# ### ##
#
 4>'$M4 # ## !'$ 4*!4
#
 4; AC'$+'#M4 # ## !$G+'# 4*!4
#
 4E#M4 # ## !
# 4*!4
#
 4N
#M4 # ## !
# 4*!4
$
# ## !

#<
<M
#
 4>##M4  E 1# ## ! 2 !# >  4*!4
#
 4L $
M4  E 1# ## ! 2 !$ $
 4*!4
#
 4O
'*$ 5$M4  E 1# ## ! 2 ! 
'*3$  $ 4*!4
*#

#< $#<M
$# 
##

'#   + $
*#

#< <M
$# 
##

'#  5$
*#

#<'<M
$# 
##

'# DB#
*#
&
&

A jeli zechcemy doda jeszcze jeden typ medium? Musielibymy wrci do tego kodu,
doda jeszcze jedn instrukcj 
i prawdopodobnie uaktualni w podobny sposb kod
w wielu innych miejscach naszej aplikacji. Programowanie zorientowane obiektowo udostpnia nam technik zwan dziedziczenie, ktra umoliwia umieszczenie szczegw specyficznych dla poszczeglnych typw obiektw w jednym miejscu, a take pozwala na
zgrupowanie cech wsplnych dla wszystkich typw obiektw. Wykorzystujc t technik,
moemy zupenie wykluczy instrukcj   w przypadkach podobnych do rozpatrywanego przez nas.
W naszym przykadzie sklepu multimedialnego moemy wyodrbni podobiestwa pomidzy rodzajami mediw w jednej klasie obiektw. Klasa taka nosi nazw klasy macierzystej,
klasy podstawowej lub klasy nadrzdnej. W ten sposb utworzymy najbardziej abstrakcyjn implementacj (atrybuty i metody), ktra odnosi si do kadego elementu, jaki chcemy
umieci w naszym sklepie. Poniej przedstawiamy fikcyjn implementacj klasy ,
:

Rozdzia 5.

Programowanie obiektowe w PHP4

139


##4G;>6NE9>P4(/
##4GPQ6NE9>P4(J
G#  

G# 
 
'$
$G+'#

#

#

 G#  ('$($G+'#(
#(
#
$G+'#/$G+'#"/

#/
#"/

#G;>6NE9>P
#"G;>6NE9>P

#!GPQ6NE9>P
#"GPQ6NE9>P
 ! " 
 !'$"'$
 !$G+'#"$G+'#
 !
#"
#
 !
#"
#
&

 
 !$G+'# 
&

  '
#
 4'$M4  !'$ 4*!4
#
 4O
'*'$+'#M4  !$G+'# 4*!4
#
 4E#M4  !
# 4*!4
#
 4N
#M4  !
# 4*!4
&
$,
##
&
!

Teraz, gdy mamy zdefiniowan klas macierzyst, moemy zastosowa sowo kluczowe

-
, aby odziedziczy atrybuty i metody po tej klasie i zdefiniowa klas potomn klasy
,
 wyspecjalizowan pod ktem konkretnego typu mediw, na przykad ksiek lub
filmw. Klasa wyspecjalizowana, powstaa wskutek dziedziczenia po klasie macierzystej,
nazywana jest klas potomn lub podklas. Przedstawiamy klas . , ktra jest klas
potomn klasy ,
. Pozostae klasy mona zdefiniowa w podobny sposb.
Dobr praktyk programistyczn jest tworzenie podklas na podstawie elementu, ktry
w przypadku podejcia proceduralnego wymuszaby wiele rozgazie kodu. W naszym
przykadzie jest to atrybut  , ktry zmusza nas do tworzenia rozbudowanych instrukcji

. Wyeliminowanie tego atrybutu i utworzenie klasy na podstawie informacji, ktre
przechowywa, pozwoli nam znacznie ograniczy komplikacje logiki w naszej aplikacji.

' 

'#R# G# 



*
 
 
'* 

140

PHP4. Zaawansowane programowanie



 ' ('$($G+'#(
#(
#(
*( ( 
'* 
LB##(*#$$$ )$C    '#(
 #  #'$C$ A
$)
*5$
 !G#  ('$($G+'#(
#(
#
 !*"*
 ! " 
 ! 
'* " 
'* 
&

  '
G# MM '
#
 4;S>M4  !* 4*!4
#
 4P M4  !  4*!4
#
 4O
'* M4  ! 
'*  4*!4
&
# 
&
!

Gdy klasa .  dziedziczy po klasie ,


, automatycznie zawiera atrybuty i metody
klasy macierzystej. Aby utworzy nowy obiekt klasy . , w jej konstruktorze stosujemy konstruktor klasy macierzystej ,
, a nastpnie inicjujemy wasne atrybuty. Taki
projekt uznaje si za elegancki, poniewa oszczdza nam inicjacji wielu atrybutw, ktre s
ju inicjowane w konstruktorze klasy macierzystej. Dotyczy to w szczeglnoci logiki kontrolujcej poprawno danych przekazanych w argumentach konstruktora. Na przykad, warto atrybutu ,
nie powinna by mniejsza od 
, a atrybut 
 nie powinien
by liczb ujemn. Umieszczajc t logik w metodach klasy ,
, moemy mie pewno,
e wszystkie klasy potomne bd rwnie miay zapewnion t sam integralno danych.
Zwrmy uwag na metod  w klasie . . Udostpniamy tutaj now implementacj metody wypisujcej informacje o obiekcie klasy . . W tej nowej metodzie
wypisujemy atrybuty klasy ,
 (uywajc operatora wywoania metody klasy, opisanego
w dalszej czci rozdziau), jak rwnie atrybuty specyficzne dla tej klasy. Nowa metoda
 przesania metod  klasy macierzystej ,
.
Poniewa nasze klasy potomne posiadaj wsplny interfejs udostpniony przez klas ,
,
moemy uywa ich w ten sam sposb, co powoduje, e s atwiejsze w uyciu, a take
atwiej jest je dalej rozwija. Poniej przedstawiamy kod wypisujcy informacje o dwch
obiektach: pierwszego klasy .  i drugiego klasy /.
'"#$'/(47 + $#$7F74(.H(JI II(@(4--.@ @HHH @@@H4(
<#9+#<(-/.@
' !$'

"#$E  (47 #9 +#4(-I--(-K II(J(4#9+#4(-/(
* 
>'$3$  $

!$'

Zwrmy uwag, e wszystkie nasze obiekty klasy ,


 zachowuj si identycznie. Udostpniaj metod , ktra nie pobiera argumentw i wypisuje informacje o odpowiednich elementach, poniewa obiekty wiedz, jakiego s typu. Pozwala to na opracowanie
wsplnego interfejsu dla rnych typw obiektw. W jaki sposb moe to pomc nam wypisywa informacje o rnych elementach w naszym sklepie? Zademonstrujemy to w podrozdziale
zatytuowanym Polimorfizm w dalszej czci rozdziau. Teraz jednak przyjrzyjmy si
jeszcze kilku interesujcym zagadnieniom dotyczcym dziedziczenia.

Rozdzia 5.

Programowanie obiektowe w PHP4

141

Operator wywoania metody klasy


Przyjrzyjmy si nowemu operatorowi oznaczanemu jako podwjny dwukropek (00), ktry
pozwala na wywoanie metody okrelonej klasy bez potrzeby tworzenia nowego obiektu.
W ten sposb dla wywoywanej metody klasy nie bdzie dostpny aden atrybut ani konstruktor. Skadnia wywoania wyglda nastpujco:
 
''( "#$

Powysza instrukcja po prostu wywoa metod klasy 1. o nazwie % 2.
Jeli metoda o podanej nazwie nie istnieje w definicji klasy, interpreter PHP zasygnalizuje
bd.
Wrmy do przykadu klasy . . W metodzie  wykorzystalimy wywoanie:
G# MM$'

Wywoanie to wywouje metod  klasy ,


. Poniewa nasza klasa .  (jak
rwnie /, %, 
) dziedziczy po klasie ,
, w efekcie wykorzystujemy
metod  klasy macierzystej. To spowoduje wypisanie informacji o obiekcie klasy
,
, po czym moemy uzupeni te informacje o specyficzne dla klasy . , wykorzystujc instrukcj
.
Jeli 1. nie jest nazw klasy macierzystej obiektu, w ktrym nastpio wywoanie,
metoda zostanie uyta w sposb statyczny, to znaczy nie bd dostpne atrybuty klasy
1.. To moe by uyteczne w celu zgrupowania podobnych funkcji w obrbie klasy.
Moemy zdefiniowa klas ,  definiujc metody 3, 
,  oraz -. Jest
to przykad banalny, niemniej jednak ilustruje moliwo grupowania funkcji, ktre powinny
by zgrupowane. Zamiast wywoania:

" - JK

moemy zastosowa klas ,  w nastpujcy sposb:



"GMM - JK

Zalet jest zgrupowanie podobnych funkcji w ramach klasy , , co pozwala na atwiejsz


modyfikacj kodu w pniejszym okresie. Ponadto kod staje si bardziej zorientowany
obiektowo, udostpniajc wszelkie zalety programowania obiektowego.
Wad takiego rozwizania jest to, e wyraenia bd dusze, poniewa za kadym razem
musimy dodawa nazw klasy przed nazw wywoywanej metody.

Ponowne wykorzystanie kodu


Dziedziczenie udostpnia dobry sposb ponownego wykorzystania kodu, lecz gwnym
zadaniem tej techniki jest specjalizacja klasy w wyniku dodania nowych moliwoci do ju
istniejcych w ramach klasy macierzystej. Ponowne wykorzystanie kodu nie jest zadaniem,
do realizacji ktrego zostao wymylone dziedziczenie w programowaniu obiektowym,
cho jest ono jedn z zalet specjalizacji klas. Zadaniem dziedziczenia jest udostpnienie

142

PHP4. Zaawansowane programowanie


moliwoci wykorzystania klas potomnych w podobny sposb. Nie martw si jednak, poniewa przyjrzymy si innym sposobom ponownego wykorzystania kodu w podrozdziale
zatytuowanym Delegacja.
Dobr praktyk programistyczn jest niewykorzystywanie dziedziczenia wycznie w celu
uzyskania korzyci z ponownego wykorzystania kodu.

Wszystkie klasy potomne (takie jak /, .  czy %) bd posiaday t sam liczb
danych i funkcji, co klasa macierzysta, lub bd posiaday dodatkowe atrybuty i metody,
niedostpne w klasie macierzystej. Innymi sowy, klasy potomne s zwykle lepiej wyposaone w funkcje od ich klasy macierzystej.

Polimorfizm
Polimorfizm jest kolejn cech programowania obiektowego, ktra pozwala na traktowanie
obiektw w jednolity sposb. Moemy wykorzysta moliwoci istniejcych klas, a take
dowolnych ich klas potomnych zdefiniowanych w przyszoci, pozostawiajc interpreterowi
wszelkie szczegy dotyczce rnic pomidzy klasami. Polimorfizm powoduje, e bardzo
atwo jest dodawa nowe klasy do systemu bez wprowadzania bdw w istniejcym kodzie.
Wrmy do przykadu ze sklepem z artykuami multimedialnymi. Gdy uytkownik systemu zada listy nowych artykuw, nie powinno mie znaczenia, czy to ksika, film czy
pyta CD. W tym miejscu wkracza wanie polimorfizm. Technika ta pozwala traktowa
obiekty reprezentujce wymienione media w jednakowy sposb. Nie musimy kopota si
sprawdzaniem typw zmiennych przy uyciu instrukcji 3 lub  . Zadanie to pozostawiamy interpreterowi PHP.
Polimorfizm jest technik atw do opanowania, gdy rozumiemy ju zasady dziedziczenia,
poniewa jedynym sposobem uzyskania zjawiska polimorfizmu jest dziedziczenie. Dziedziczenie pozwala na tworzenie abstrakcyjnej klasy macierzystej, a nastpnie implementowanie metod tej klasy w klasach potomnych. W naszym przykadzie wszystkie klasy
potomne posiadaj wasne metody suce prezentacji informacji na ich temat. Nasza klasa
macierzysta zawiera metod , co gwarantuje nam, e wszelkie klasy potomne bd
posiada t sam metod. Oto przykad:

# ##"#$' (#$E  (#$' (#$E  
 #
# ### ##
# ## !$'
#
 4*!*!4
&

Powyszy kod wypisze kolejno informacje na temat kadego obiektu medium, niezalenie
od tego, czy to jest CD, ksika, czy te film lub te program komputerowy. Pomimo istnienia rnic w klasach potomnych klasy ,
, moemy traktowa je podobnie, poniewa wszystkie posiadaj metod . Interpreter PHP rozpozna sytuacj i zdecyduje,
co naley zrobi.

Rozdzia 5.

Programowanie obiektowe w PHP4

143

Przedstawiony kod demonstruje eleganckie rozwizanie problemu wypisania listy artykuw w sklepie. Jest ono o wiele prostsze od rozbudowanego rozwizania opierajcego si
na technice przedstawionego wczeniej programowania proceduralnego. Zamy, e musimy
doda klas o nazwie 1.
. Dodamy now klas potomn klasy ,
 i utworzymy
kilka obiektw nowej klasy w tablicy 


 , a nasza metoda wypisania elementw nie
bdzie wymaga adnych zmian:
# ##12"#$+>  # 
 #
# ### ##
# ## !$'
#
 4*!*!4
&
!

Powyszy kod wypisze istniejc list, a take nowo utworzony obiekt klasy 1.
.
Zwr uwag na to, e nie musielimy wprowadzi jakichkolwiek zmian w instrukcji 3

. Polimorfizm umoliwia tworzenie takiego wanie kodu, atwego w rozbudowie i zrozumieniu. Dziedziczenie samo w sobie posiada niewiele zalet. Uywamy dziedziczenia,
aby skorzysta z zalet polimorfizmu, ktry pozwala nam tworzy kod przejrzysty i atwy
w rozbudowie. Dziedziczenie nie jest tylko sposobem na ponowne wykorzystanie kodu, jak
zauwaylimy wczeniej, jest przede wszystkim sposobem na udostpnienie polimorfizmu
w kodzie aplikacji. Gdy zapoznamy si z rnymi ukadami projektowymi, uzmysowimy
sobie, jak wiele problemw programistycznych mona rozwiza dziki wykorzystaniu
dziedziczenia i polimorfizmu.

Metody abstrakcyjne
Gdy stosujemy dziedziczenie, czsto klasa macierzysta definiuje metody nie zawierajce
kodu, poniewa zdefiniowanie mechanizmw w postaci wsplnej dla wszystkich klas potomnych nie jest moliwe. Technik tak, zwan metodami abstrakcyjnymi, wykorzystujemy, aby zaznaczy fakt, e metoda nie zawiera kodu i programista implementujcy
klasy potomne musi zaimplementowa mechanizmy tych metod. Jeli metoda nie zostaje
przesonita (co zostao omwione w podrozdziale Dziedziczenie), nadal nie bdzie realizowa adnych zada.
Jeli nie zdefiniujemy metody abstrakcyjnej, a klasy potomne nie przesoni jej, zostanie
wywoany bd wykonania zgaszajcy brak metody w obiekcie. Dlatego wane jest definiowanie pustej metody w sytuacji, gdy nie chcemy lub nie moemy zdefiniowa adnego
mechanizmu dziaania metody.
W terminologii obiektowej zdefiniowanie metody jako abstrakcyjnej z reguy wymusza
na programicie przesonicie jej w klasie potomnej. PHP nie obsuguje takiego wymuszenia z powodu ogranicze w zaimplementowanym modelu obiektowym. Osoby implementujce klasy potomne powinny zapozna si z dokumentacj klas macierzystych, aby okreli, ktre z metod powinny zosta przesonite.

Pomimo braku sw kluczowych w PHP, ktre definiowayby metody abstrakcyjne, przyja si notacja uywana przez programistw dla wskazania metody abstrakcyjnej. Aby
wskaza osobie implementujcej klasy potomne, e metoda jest abstrakcyjna i powinna zosta przesonita, definiujemy j jako pust. W naszym przykadzie metoda abstrakcyjna
jest zaznaczona pogrubion czcionk:

144

PHP4. Zaawansowane programowanie



7
$ 

7
$

#
'$ 

 7
$#('$ 
 !#"#
 !'$ "'$ 
&

  *#';#
# !#
&

  *#'>'$ 
# !'$ 
&
&  

!")" *" "  + "#$%
&
!

W klasie # metod 


,


'  zdefiniowalimy jako pust, aby
zaznaczy, e jest to metoda abstrakcyjna. Przyczyn zdefiniowania tej metody jako abstrakcyjnej jest brak moliwoci okrelenia sposobu wyliczania zarobkw kadego pracownika
w jednolity sposb. Gdy w firmie istniej rne stanowiska, takie jak dyrektorzy, handlowcy,
inynierowie i pracownicy produkcyjni, paca kadego z pracownikw jest naliczana w inny
sposb. Przeanalizuj, w jaki sposb okrelamy pac dyrektora:

#T#6 
#47
$ 4
U#  

U# #R# 7


$

#

 7
$#('$ (#
7
$MM7
$#('$ 
 ! 7###
&

  7###
#/#"/
 !#"#
&

  *#'G##
'#% *

# !#
&
&
!

Metod abstrakcyjn 


,


'  klasy # przesaniamy metod
obsugujc dziaanie specyficzne dla dyrektorw. W naszym przykadzie po prostu zwracamy warto atrybutu 
2.

Rozdzia 5.

Programowanie obiektowe w PHP4

145

Handlowiec moe otrzymywa miesiczn pensj, ale moe te otrzymywa dodatek obliczany na podstawie wielkoci zysku, ktry przynis firmie w danym miesicu. Poniej
przedstawiamy implementacj klasy 4
, ktra realizuje powysze zaoenia:

#T#6 
#4U#  4
##4UNGVO>P67W9G;P4( -J
F $#


F $#
#R# U# 
#
#$ AC / $ 
'# ' 
'*'# '#
 $

 F $#
#('$ (#(
#($ 
'# '
U# MMU# #('$ (#
 ! 7###
 ! L 
'# '$ 
'# '
&

  7###
#/XX#!-#"UNGVO>P67W9G;P
 !#"#
&

  L 
'# '$ 
'# '
$ 
'# '/$ 
'# '"/
 !$ 
'# '"L 
'# '
&

  *#'G##
'#% *
#U# MM *#'G##
'#% *0
 !#Y !$ 
'# '
&
&
!

W naszej klasie 4


 wykorzystujemy mechanizmy klasy 5
 i dodajemy dwa
atrybuty, 
 oraz  
. Atrybut 
 okrela procent od wartoci
sprzeday, ktry suy wyliczeniu premii doliczanej do pensji w celu obliczenia wypaty,
natomiast  
 stanowi warto sprzeday dokonanej przez naszego handlowca w miesicu, za ktry obliczamy zarobki. Sposb obliczania miesicznych zarobkw
rni si wic od sposobu przyjtego dla dyrektora, dlatego inna jest te implementacja
metody 
,


' .
Podobnie moemy postpi z pacami inynierw i pracownikw produkcyjnych. Poniej
przedstawiamy przykad metody 
,


'  dla pracownika rozliczanego
na podstawie godzin pracy:

  *#'G##
'#% *
# ! 
'*'#
$
Z 'Y !$%Z '#
&

146

PHP4. Zaawansowane programowanie


Jak wida w powyszych przykadach, klasa # nie moe definiowa logiki obliczania miesicznych zarobkw w klasie macierzystej, dlatego rozwizanie tego problemu
pozostawiono klasom potomnym.

Adekwatno i powizania
Omwilimy ju sposb przechowywania danych wewntrz obiektw, a take wykorzystalimy wicej ni jedn klas w celu rozwizania problemu. W tym miejscu napotykamy
pojcia adekwatnoci oraz powiza klas.
Adekwatno jest stopniem dostosowania atrybutw i metod do potrzeb obiektu. Czy metody i atrybuty klasy s cile powizane, powodujc, e obiekt jest w duym stopniu dostosowany do swojego przeznaczenia, czy te obiekty tej klasy s zmuszone do realizacji
setek rnych zada?
Niektrzy programici nie zdaj sobie sprawy z potencjau drzemicego w programu
obiektowym, cho by moe s skuteczni w tworzeniu oprogramowania wykorzystujcego
obiekty. Utworzenie moduu i opakowanie go w klas nie wystarczy, by rozwizanie takie
byo naprawd zorientowane obiektowo. Obiekty tworzone w ten sposb w rzeczywistoci
realizuj zadania caego programu w ramach jednej klasy. Przyjrzyjmy si przykadowi,
w ktrym pominito implementacj metod, aby zademonstrowa podejcie do programowania obiektowego charakteryzujce si niskim poziomem adekwatnoci, polegajce na
implementacji caoci w postaci pojedynczej klasy boskiej. W tym przykadzie zademonstrujemy mechanizm formularzy, ktry sprawdza poprawno wprowadzanych danych,
wypisuje kod formularza, a take generuje kod JavaScript do obsugi formularza:

#
':  '
  '#
# ##:  '
 #:  '
  '

 $ ':  '&

  9 ##:  '  '('$($ 
(*&

 $ '7 $ 
:  '  '&

 $ '7 $ 
9 ### ##:  '&

 +## =
# ##:  '&

  *#' =
9 ##:  '# ##:  '&

 $':  '  '&

 $'9 ##:  '# ##:  '&

   :  '  '&
&

Powyszy kod to klasa zawierajca struktury i metody przetwarzajce wszystko, co ma


zwizek z formularzami. W wielu spord tych metod bdzie wystpowa instrukcja  
z dziesicioma lub wicej elementami, w zalenoci od poziomu komplikacji obsugiwanych formularzy, wliczajc w to kilka specjalnych kombinacji, takich jak elementy formularza obsugujce przesyanie plikw, wprowadzanie dat i tak dalej. Aby obsuy przypisywanie stylu do elementw formularzy, rwnie trzeba bdzie zastosowa instrukcj
 . Jaka jest wic rnica midzy tym sposobem a rozwizaniem proceduralnym, z du
iloci zmiennych globalnych zamiast atrybutw i uyciem zwykych funkcji w miejsce
metod? Absolutnie adna.

Rozdzia 5.

Programowanie obiektowe w PHP4

147

Jak wida w powyszym przykadzie, zastosowanie nieadekwatnych klas prowadzi do powstania klas boskich i stanowi bdne podejcie do rozwizania problemu. Przedstawiony
przykad nie wykorzystuje zalet programowania obiektowego. Gdy projektujesz klas, staraj si j zminimalizowa tak, jakby to bya funkcja. Najlepszym podejciem jest specjalizacja funkcji w sposb, ktry zapewnia jak najdoskonalsz realizacj pojedynczego zadania. Dokadnie ta sama zasada dotyczy obiektw. Gdy wystpi konieczno wprowadzenia
zmian w kodzie, bdziesz wiedzia dokadnie, gdzie go szuka. To znacznie upraszcza proces usuwania bdu, oszczdzajc nam koniecznoci przegldania tysicy wierszy kodu
w ramach pojedynczego pliku. Dlatego naley powici sporo uwagi projektowi klas i odpowiedniemu oddzieleniu logiki od danych, poniewa tworzenie wysoce adekwatnych
obiektw jest w dalszej perspektywie bardzo korzystne.
Przeniemy nasz dyskusj na zagadnienia zwizane z powizaniami.
Pojcie powiza dotyczy liczby wzajemnych relacji pomidzy dwoma lub wiksz liczb
obiektw. Gdy mamy do czynienia z dwoma obiektami, ktre s wiadome wzajemnego
istnienia, mwimy o silnych powizaniach. Mona to porwna do bdnego zdefiniowania kanaw komunikacyjnych celem wymiany informacji pomidzy kilkoma osobami.
W tym przypadku kady ma powizania z prawie kadym:
A

E
D

Powyszy diagram przedstawia pi obiektw, z ktrych kady ma powizania z przynajmniej jednym z pozostaych. Strzaki okrelaj kierunek komunikacji (jedno bd dwukierunkow). Obiekt D zawiera kod, ktry zakada istnienie obiektw A, C oraz E. Podobnie
obiekty A, C oraz E zawieraj kod, ktry zakada istnienie obiektu D. Poniewa obiekt D
wykorzystuje dwustronn komunikacj z pozostaymi obiektami, wida od razu, e zosta le
zaprojektowany. Przyjmijmy, e moemy doda nastpn klas, aby rozbi powizania
w nastpujcy sposb:
A

E
X

Przenoszc cz zada z obiektu D do X, zmniejszylimy poziom powiza pomidzy


obiektami w programie. Mona zaoy, e X jest naszym programem gwnym, poniewa
zarzdza on dziaaniem pozostaych klas. Najprawdopodobniej obiekt D realizowa dwa
zadania zamiast jednego, wic istnieje zwizek pomidzy adekwatnoci a powizaniami.

148

PHP4. Zaawansowane programowanie


Minimalizacja liczby powiza stanowi dobr praktyk programistyczn. Gdy moduy s
powizane w sposb luny, znacznie zwiksza si nasza moliwo ich ponownego zastosowania, poniewa staj si bardziej adekwatne. Warto powici wiele czasu i wysiku
w trakcie projektowania aplikacji. Wysiek ten opaci si podczas pracy nad projektem realizujcym podobne zadania. Bdzie mona oszczdzi sporo czasu na tworzeniu komponentw programistycznych realizujcych podobne zadania.
Pisanie adekwatnych, lecz luno powizanych moduw powinno by naszym nadrzdnym celem podczas tworzenia kodu z zaoenia przeznaczonego do ponownego wykorzystania i rozwoju.

Modelowanie obiektowe z uyciem UML


Wszystkie jzyki wymagaj pewnej formalizacji opisu. Diagramy klas utworzone w UML-u
(Unified Modeling Language) daj nam moliwo opisu projektw za pomoc symboli
graficzno-tekstowych zamiast fragmentw kodu. Jzyk UML jest okrelany jako meta-jzyk.
Zosta opracowany przez Object Management Group (http://www.omg.org/) i jest przeznaczony do opisu rnych faz procesu projektowania i tworzenia oprogramowania. UML bardzo dobrze sprawdza si jako sposb opisu projektw baz danych oraz programw zorientowanych obiektowo.
Zastosowanie UML-u jest doskonaym sposobem realizacji projektu aplikacji przed rozpoczciem pisania kodu. Etap ten umoliwia spojrzenie na poszczeglne elementy projektu
w sposb niezaleny od zastosowanego jzyka programowania, przypisanie programistom
poszczeglnych elementw systemu, a take oszacowanie czasu trwania cyklu tworzenia
aplikacji. W tym podrozdziale omwimy kilka kluczowych schematw projektowych, ktre
pomog w tworzeniu elastycznych i skalowalnych aplikacji internetowych. Zapoznamy si
z jednym z elementw UML-u, nazywanym diagramem klas uywanym do opisu modelu
obiektowego.
Klasa jest przedstawiana w UML-u w postaci prostokta zawierajcego nazw, atrybuty
i usugi oddzielone liniami. Podstawowy symbol klasy w UML-u wyglda nastpujco:
Klasa
atrybut 1
...
atrybut N
metoda 1
...
metoda N

Czsto atrybuty s pomijane, a wyliczone zostaj tylko metody. To zaley od tego, jak duo
czasu potrzebujesz na zapisanie swoich koncepcji.
Wyliczenie atrybutw wraz z metodami jest dobr praktyk, szczeglnie w przypadku
wsppracy z bazami danych.

Rozdzia 5.

Programowanie obiektowe w PHP4

149

Teraz, gdy znamy sposb modelowania prostych klas, przyjrzyjmy si sposobowi modelowania bardziej skomplikowanych klas zawierajcych inne klasy. Nie przedstawiamy ich jako atrybuty klasy. Przedstawiamy je jako dwa diagramy klas w UML-u i czymy je lini
z symbolem rwnolegoboku w nastpujcy sposb:
Klasa 1
atrybut 1
...
atrybut N
metoda 1
...
metoda N

Klasa 2
atrybut 1
...
atrybut N
metoda 1
...
metoda N

Ten diagram przedstawia, e . " jest zagniedona w . . Nasz przykad klasy 
 mona zobrazowa nastpujco:

Kluczyk
pasuje()

Samochod
start()
stop()
ustalPredkosc()

Silnik
start()
stop()
pracuje()

Oznacza to, e  zagnieda w sobie obiekty klas  2  oraz  . Wypenione
rwnolegoboki oznaczaj, e komponenty musz zosta utworzone w celu prawidowego
funkcjonowania obiektu, w ktrym s zagniedone. Pamitajmy, e za prawidow inicjacj
wszelkich atrybutw klasy odpowiedzialne s konstruktory. Analizujc powyszy diagram,
programista widzi, jakie obiekty musz zosta utworzone w celu udostpnienia wszelkich
usug obiektu nadrzdnego.
Moliwe jest rwnie zastosowanie symbolu pustego (niewypenionego) rwnolegoboku
w diagramie powiza obiektw. Zastosowanie tego symbolu wskazuje, e nie ma koniecznoci inicjacji obiektu w celu prawidowego funkcjonowania klasy nadrzdnej. Oto przykad dodania obiektu klasy  / do klasy :
Samochd
start()
stop()
ustalPredkosc()
utworzOdtawrzaczCd()

OdtwarzaczCd
odtwarzaj()
stop()
pauza()

Nie wszystkie samochody musz mie zainstalowane odtwarzacze CD, wic sygnalizujemy
ten fakt, stosujc symbol pustego rwnolegoboku. W przypadku wystpowania obiektw,
ktre nie musz by inicjowane w konstruktorze klasy nadrzdnej, naley zastosowa metod fabryczn (omwion wczeniej) suc do utworzenia takiego obiektu, na przykad
   / w przypadku naszej klasy . Rnica w stosunku do klas
 oraz  2  polega na tym, e nie udostpniamy metod fabrycznych  
  czy te   2
 w klasie , poniewa nie maj one sensu w sytuacji, gdy obiekty wspomnianych klas s inicjowane w konstruktorze.

150

PHP4. Zaawansowane programowanie


Zdarza si, e klasa wykorzystuje obiekty innych klas w swoich metodach, lecz ich nie
zagnieda. Na przykad moemy potrzebowa klasy 5  w celu wykonywania operacji na
znacznikach czasu systemu UNIX. Taki zwizek pomidzy obiektami oznaczany jest w postaci linii bez symbolu rwnolegoboku.
Kalendarz
wypisz()

Data
jestPrzed()
jestPo()
jestRowna()
sklonuj()
pobierzDzien()
pobierzDzienTygodnia()
...

Skoro poznalimy sposb modelowania zagniedania obiektw, przejdmy do sposobu modelowania dziedziczenia. W naszym przykadzie sklepu z multimediami mielimy do czynienia z rnymi rodzajami mediw, na przykad z ksikami, pytami CD czy te filmami.
Utworzylimy klas macierzyst o nazwie ,
, a nastpnie utworzylimy jej klasy potomne w celu reprezentacji rnych typw mediw dostpnych w naszym sklepie. Aby
przedstawi zwizki dziedziczenia pomidzy klasami . , / i innymi a klas ,
,
uyjemy symbolu wypenionego trjkta czcego za pomoc linii klas macierzyst z klasami potomnymi. Oto model w UML-u dla naszego sklepu z multimediami:
Medium
kup()
wypiszMedia()
wypisz()

Ksiazka
wypisz()

CD
wypisz()

Oprogramowanie
wypisz()

Film
wypisz()

Warto zwrci uwag, e nie ma potrzeby wyliczania w diagramach klas potomnych wszystkich metod klasy macierzystej. Z zaoenia wiadomo, e wszystkie klasy potomne posiadaj metody klasy macierzystej. Dobr praktyk jest jednak umieszczanie nazw metod klasy
macierzystej przesonitych w klasach potomnych, jak metoda  z naszego przykadu.
Gdy klasy rozrastaj si, mona rwnie pomin je dla oszczdzenia miejsca. Oczywicie,
mona rwnie zastosowa kolejne dziedziczenie, na przykad klasa % moe mie klasy
potomne o nazwach 64 oraz 565, o ile taka decyzja stanowi waciwe rozwizanie upraszczajce implementacj. W dalszej czci rozdziau zajmiemy si analiz przypadkw,
w ktrych lepiej zastosowa dziedziczenie oraz innych, ktre s lepiej reprezentowane w postaci zagniedania obiektw. W tej chwili jednak zajmijmy si specyficznym typem zawierania, nazywanym delegacj.

Delegacja
Delegacja jest specyficzn odmian zawierania si obiektw suc ponownemu wykorzystaniu kodu obiektw. Gdy klasa ma za zadanie udostpnienie usugi, moe po prostu

Rozdzia 5.

Programowanie obiektowe w PHP4

151

oddelegowa jej realizacj obiektowi, ktry jest w niej zawarty i po prostu przekaza wynik.
Uywajc delegacji, obiekt nie posiada fizycznego powizania, jak na przykad silnik z samochodem. Jedynym zadaniem obiektu zawartego w obiekcie nadrzdnym jest udostpnienie
usugi w celu uproszczenia projektu obiektu nadrzdnego i uczynienia go bardziej spjnym.
Jako przykad utworzymy obiekt formularza, ktry wypisuje i sprawdza poprawno danych formularzy WWW. Jednym z projektw mogoby by sprawdzanie danych wewntrz
obiektu formularza. Jednake nie jest to najlepsze rozwizanie. O wiele lepiej byoby utworzy osobn klas obiektu sprawdzajcego poprawno i wykorzysta go do udostpnienia
metod sprawdzania poprawnoci danych formularza, w ktrym obiekt kontrolny jest zawarty.
Oto diagram w UML-u ilustrujcy ten przykad:
Formularz
dodajElement()
dodajPrzycisk()
weryfikuj()
wypisz()
ustalStyl()
pobierzKomunikatOBledzie()

WeryfikatorDanych
dodaj()
weryfikuj()
pobierzKomunikatOBledzie()

Obiekt klasy 7
3  5 jest zawarty w obiekcie klasy % i jest tworzony
w trakcie jego tworzenia. Dlaczego postpujemy w ten sposb? Zamy, e potrzebujemy
obiektu weryfikujcego dane w innej aplikacji, na przykad w programie e-mailowym.
W innym przypadku konieczne byoby ponowne zakodowanie mechanizmw klasy 7
3
 5 w kadej nowej aplikacji. Lepiej jest utworzy klas 7
3  5, ktr
mona wykorzysta w kadej chwili, gdy wyda si potrzebna.
Zgodnie z nasz wczeniejsz dyskusj dotyczc adekwatnoci, klasa % zachowuje
si w sposb kojarzcy si z klas bosk, obsugujc elementy formularza, kod JavaScript,
wypisywanie formularza z uwzgldnieniem formatowania i weryfikacji danych. Rozsdniej
byoby umieci obsug tych zada w osobnych klasach i po prostu delegowa zadania
klasy %.
Kolejn wan obserwacj jest to, e klasa % jest wiadoma istnienia klasy 7
3
 5, lecz klasa 7
3  5 nie wie nic o tym, e jest zawarta w klasie %
. Dzieje si tak, poniewa klasa 7
3  5 nie posiada adnego odwoania
do klasy %. Dziki temu komunikacja pomidzy klasami jest jednokierunkowa zamiast dwukierunkowej. A zatem wykorzystujc moliwoci delegacji, zmniejszylimy liczb
powiza obiektw. Bardzo wane jest poznanie moliwoci ponownego wykorzystania
kodu, poniewa celem programisty powinno by tworzenie adekwatnych obiektw, ktre s
ze sob bardzo luno powizane. Przeanalizujmy poniszy przykad.
Przykad prezentuje trzy metody delegujce zadania do klasy 7
3  5. Pierwsz
metod jest 2&

 , ktra zgasza obiektowi klasy 7
3  5 warto, typ
oraz komunikat o bdzie dotyczce elementu formularza.
Y
U # $# ##   ''+)'+ $#  $

  9 ### ##
 !# ##12"# ##

Y

152

PHP4. Zaawansowane programowanie


'+) '### ##$$# '#
 '#*L#
"## ## !$'##W#+ #[[
## ## ! NS # '#
 '#*L#

 !$#  ! # ## !$ 
(
# ## !$'##W#+ #(# ## ! NS # '#
&
&

Zadaniem metody 2&



  jest dodawanie elementw do formularza, jak rwnie
zgaszanie ich do weryfikacji. Innym sposobem mogoby by utworzenie dodatkowej listy
obiektw do weryfikacji w ramach klasy %, lecz zdecydowalimy si na przekazanie
tego zadania obiektowi 
3  . Przyjrzyjmy si nastpnej metodzie przekazujcej
cz zada weryfikatorowi:
Y
L## *#  ' :
'$
$ AC#(#A $'#
# ##D $#($'#
$$ '$
 #
Y

 $## ##
# !$#  !$#
&

Powysza funkcja przekazuje zadanie weryfikacji obiektw formularza metodzie 


3
2 klasy 7
3  5. Operacja ta spowoduje przechowanie komunikatw o bdach, ktre mona wydoby za pomoc nastpujcej metody:
Y
L *$  *), 
$+## $#
'$ # 
$# 7 $*C$$ )$$)D
'#$' '$5
#
$ A
 #'#'# ,$#

  *#' NS # 

# !$#  ! *#' NS # 

&

Y

Udostpniajc interfejs na podstawie obiektu weryfikatora, obiekt klasy % dziaa


jak obiekt poredni przekazujcy wykonywanie zada swoim obiektom skadowym.
Jak wida zatem, moemy tworzy eleganckie rozwizania czstych problemw, stosujc
delegacj usug do wyspecjalizowanych obiektw, i w ten sposb tworzc moduy lepiej nadajce si do ponownego wykorzystania i dalszego rozwoju.

Analiza i decyzje projektowe


Obiekty s czsto projektowane w sposb sugerujcy, e ich gwnym zadaniem jest przechowywanie danych. Taka metodologia jest nieprawidowa w programowaniu zorientowanym
obiektowo. Cech rnic obiekt od innych struktur danych jest umiejtno wiadczenia
usug specyficznych dla obiektu. Przyjrzyjmy si przykadowi, w ktrym obiekt nie udostpnia usug, ktrych mona byoby od niego oczekiwa:

Rozdzia 5.

Programowanie obiektowe w PHP4

153

7
R

 

 7R(
 !$QR
 !$V
&

 $QR
 !R"R
&

 $V
 !"
&

 $  
 ! " 
&

  *#'Q
# !R
&

  *#'V
# !
&

  *#' 
# ! 
&

 

&
&

Na pierwszy rzut oka wyglda to na niez reprezentacj punktu na paszczynie. Przyjrzyjmy si jednak moliwociom zastosowania takiej klasy:
"#$7/(@/
 !
R" ! *#'Q
R0"H.
" ! *#'V
0"IK
 !$QR
 !$V
 !

Zastanwmy si przez chwil, jakie problemy mog pojawi si z wykorzystaniem takiego


kodu. Mimo e pozornie wszystko jest w porzdku, po gbszym zastanowieniu mona wykry problemy. Dlaczego nasz kod podejmuje decyzje w imieniu obiektu? Dlaczego stosujemy operacje typu - * - 8 ", skoro powinien robi to sam obiekt? Czy obiekt nie powinien umie dokonywa operacji na swoich atrybutach? Przykadowa klasa nie zostaa
zdefiniowana prawidowo, poniewa nie wykorzystuje osadzania. Poniej przedstawiamy
lepsz definicj klasy # :

7
R

 

154

PHP4. Zaawansowane programowanie



 7R"/("/
 !'#U R(
&

 '#U R(
 !R"R
 !"
&

 '#Q$ 

 !R0"$ 

&

 '#V$ 

 !0"$ 

&

 '#$ 
Q($ 
V
 !'#Q$ 
Q
 !'#V$ 
V
&

 $  
 ! " 
&

 

&
&

Zobaczmy, jak bardzo uproci si nasz kod i w jaki sposb osignlimy hermetyzacj
obiektu. Wykorzystanie klasy jest podobne jak w poprzednim przykadzie:
"#$7/(@/
 !'#H.(IK
 !

Szczegy implementacji zostay ukryte, a obiekt podejmuje samodzielne decyzje. Stosujc


si do podobnych zasad zwikszajcych hermetyzacj wszystkich obiektw w programie,
osigamy wiksz czytelno i moliwo atwiejszego dokonywania zmian w programie.

Funkcje PHP obsugujce klasy


PHP udostpnia szereg funkcji upraszczajcych prac z obiektami i klasami. Niektre z tych
funkcji pozwalaj unikn niektrych problemw w przypadku koniecznoci wykorzystywania kiepskich projektw obiektowych.

get_class()
",, -# $

Funkcja 
 zwraca nazw klasy obiektu. Szczeglnie uyteczna jest podczas procesu wyszukiwania i usuwania bdw, umoliwiajc sprawdzenie, czy w programie bior
udzia waciwe obiekty. Na przykad, gdy posiadamy metod oczekujc obiektu klasy
9  , moemy zastosowa t funkcj w celu usprawnienia wyszukiwania bdw:

Rozdzia 5.

Programowanie obiektowe w PHP4

155


  '
' $
#+#6
' $""<' $<
# !$ ' "" !$+L ' 
##
&
# #
&

Funkcja 
 umoliwia weryfikacj poprawnoci danych i jest uyteczn alternatyw funkcji 2
  sprawdzajcej, czy argument jest obiektem klasy. Taka moliwo pozwala na zaoszczdzenie czasu podczas usuwania bdw w aplikacjach wykorzystujcych wiele powiza pomidzy obiektami rnych klas.
Naley zwrci uwag na fakt, e PHP zamienia nazwy klas na mae litery, naley wic
w porwnaniach stosowa nazwy klas skadajce si z maych liter. W naszym przykadzie porwnywalimy wynik dziaania funkcji 
 z napisem   zamiast 9  .
Porwnanie z napisem 9  daoby wynik negatywny, ponadto wywoaoby bd asercji.

get_parent_class()
",, -) -# $

Funkcja ta jest szczeglnie uyteczna podczas sprawdzania poprawnoci kodu wykorzystujcego mechanizmy polimorfizmu. Nie bdzie potrzebna w ostatecznej wersji aplikacji,
poniewa w tym przypadku wszystkie obiekty powinny by egzemplarzami klas potomnych prawidowo skomponowanych klas macierzystych. Jeli zaoenie takie nie jest spenione, tworzona aplikacja zawiera powane bdy koncepcyjne. Oto fragment kodu kontrolnego w metodzie polimorficznej:

 $'L' 
 #
 !# ### ##
#+#6#6
# ##""<# ##<
# ## !  
&
# #
&

Funkcja oczekuje tablicy elementw bdcych egzemplarzami klas potomnych klasy &


i w kolejnoci wypisuje je na wyjcie. Program stosuje asercj zakadajc przynaleno
kadego elementu do klasy potomnej klasy &

 . Kod podobny do powyszego moe okaza si uytecznym w trakcie usuwania bdw, lecz powinien by wyczany w rodowisku
produkcyjnym. Wicej informacji na temat usuwania bdw znajdziesz w rozdziale 6.

Ograniczenia PHP
Jak wspomnielimy wczeniej w tym rozdziale, implementacja technik zorientowanych
obiektowo w PHP posiada swoje ograniczenia. W tym podrozdziale omwimy najczciej
wspominane ograniczenia PHP, takie jak brak atrybutw statycznych, brak destruktorw
oraz brak wielokrotnego dziedziczenia.

156

PHP4. Zaawansowane programowanie

Brak atrybutw statycznych


PHP udostpnia programistom operator wywoania metody klasy (wspomniany w podrozdziale dotyczcym dziedziczenia) umoliwiajcy statyczne wywoywanie metod. Niestety,
jzyk ten nie udostpnia statycznych atrybutw. Czym jest atrybut statyczny? Jest to zmienna
globalna przywizana do przestrzeni nazw klasy (w przeciwiestwie do przestrzeni nazw
obiektu). Oznacza to, e jest to pojedyncza zmienna uywana przez wszystkie egzemplarze
klasy, nie za unikalna dla kadego z egzemplarzy.
Do czego s potrzebne atrybuty statyczne? Czasem wygodniej jest uywa jednego zestawu
danych we wszystkich obiektach tej samej klasy, zamiast stosowa je wielokrotnie w kadym egzemplarzu, oszczdzajc w ten sposb pami. Drugi powd stosowania atrybutw
statycznych to kontrola stanu jakiego atrybutu, jednolitego dla wszystkich obiektw klasy,
jak na przykad liczba obiektw klasy istniejcych w danym momencie.
Wiele jzykw, na przykad Java, obsuguje atrybuty statyczne, jednak PHP nie posiada takiej
wasnoci. Mona jednak zasymulowa t obsug, stosujc kombinacj zmiennych globalnych i metod statycznych. Przyjrzyjmy si zastosowaniu takiej techniki na przykadzie klasy
:  wykorzystujcej symulacj atrybutu statycznego w celu ledzenia liczby egzemplarzy
klasy istniejcych w pamici:

*  

=*  
#%# ' #

Konstruktor klasy :  zawiera kod zwikszajcy o jeden warto zmiennej globalnej
:
, co odzwierciedla fakt utworzenia nowego jabka.

 =*  
+ *  
'*=* #
 
'*=* #00
 !#%# ' #" #
&

Z kolei metoda 2
 zmniejsza o jeden warto zmiennej globalnej :
:

 '# '
\ !#%# ' #
+ *  
'*=* #
 
'*=* # 
 !#%# ' #"#
&
&

 #%# ' #
# !#%# ' #
&

Zwr uwag, e zmienna globalna zostanie zmniejszona wycznie w przypadku, gdy jabko
nie zostao jeszcze zjedzone. Pozwala to na zachowanie spjnoci emulowanego atrybutu
statycznego. Na kocu definiujemy metod  zwracajc liczb istniejcych w pamici obiektw klasy : :

Rozdzia 5.

Programowanie obiektowe w PHP4

157

# 
'

  
'*
+ *  
'*=* #
# 
'*=* #
&
&
-"#$=*  $ 
'*=* #."#$=*  $ 
'*=* #.
H"#$=*  $ 
'*=* #H
#
 =*  MM 
'* 4*!4$#H
- !'# '$ 
'*=* #.
. !'# '$ 
'*=* #@"#$=*  $ 
'*=* #.
#
 =*  MM 
'* 4*!4$#.
!

Mimo e stosowanie zmiennych globalnych jest powszechnie uwaane za nieeleganckie, zastosowanie tej metody w celu zasymulowania atrybutu statycznego w PHP jest
cakiem efektywne.

Po wywoaniu powyszego kodu przegldarka wywietli liczby  oraz ", zgodnie z komentarzami w powyszym kodzie. Emulowanie atrybutw statycznych to uyteczna technika,
lecz naley by wiadomym problemw zwizanych z jej stosowaniem:


technika ta nie zabezpiecza zmiennych przed modyfikacj z zewntrz


bez wykorzystania do tego celu metod statycznych, co w konsekwencji
moe doprowadzi do zaburzenia integralnoci atrybutu z klas;

atrybut nie jest w rzeczywistoci zwizany z klas, co utrudnia innym


programistom orientacj i wymaga zastosowania wikszej liczby komentarzy
w celu zaznaczenia wykorzystania atrybutu statycznego;

inne obiekty mog bez problemu zamaza (usun) zawarto zmiennej globalnej,
jeli nie s wiadome wykorzystania jej w charakterze atrybutu statycznego.

Wymienione problemy s typowe dla stosowania zmiennych globalnych, wic symulowanie atrybutw statycznych za pomoc zmiennych globalnych nie stanowi wyjtku.

Brak destruktorw
Konstruktory inicjuj stan obiektw tak, aby mona byo z nich korzysta natychmiast po
utworzeniu. Inn koncepcj programowania zorientowanego obiektowo jest pojcie destruktora, uywanego do usuwania atrybutw obiektu, w tym zagniedonych obiektw, lub te
wykonania innych czynnoci zwizanych z koczeniem dziaania obiektu, jak na przykad
zamykania poczenia z baz danych. W PHP nie istnieje moliwo likwidowania obiektw w ten sposb. Zamiast tego PHP po prostu usuwa z pamici obiekty utworzone przez
skrypt w momencie zakoczenia dziaania skryptu.

158

PHP4. Zaawansowane programowanie

Brak wielokrotnego dziedziczenia


Wielokrotne dziedziczenie umoliwia jednoczesne dziedziczenie atrybutw i metod klasy
po kilku klasach macierzystych. Na przykad istnienie klas ;
 oraz 5
 umoliwia utworzenie klasy potomnej 5
$
 dziedziczcej po obu wspomnianych
klasach.
W PHP nie mona zdefiniowa dziedziczenia atrybutw oraz metod po wicej ni jednej
klasie macierzystej za pomoc sowa kluczowego
-
. W przeciwiestwie do PHP, inne
jzyki, na przykad C++, umoliwiaj wielokrotne dziedziczenie. Podobnie jak ma to miejsce w przypadku atrybutw statycznych, moemy emulowa podane mechanizmy, w tym
przypadku stosujc kombinacj dziedziczenia i delegacji. Sztuczka polega na dziedziczeniu
po jednej klasie, natomiast moliwoci pozostaych klas osigniemy, definiujc metody
delegujce zadania do metod obiektw zagniedonych. Takie rozwizanie nie jest optymalne
w przypadku, gdy liczba klas, po ktrych chcemy dziedziczy, jest dua, lecz w przypadku
dziedziczenia po dwch, trzech klasach moe wyda si dobrym rozwizaniem.
Oto przykad klasy 5
$
 bdcej przykadem zastosowania powyszej techniki symulacji wielokrotnego dziedziczenia po klasach ;
 oraz 5
:

 #  

U# 
#('$ 

 U# #('$ 
 !#"#
 !'$ "'$ 
&

 '' '7
$#
$
 ''D 'D

$#

&

  
7
$ $
$

 $)
D
#,
$ $

&
&
!

Nie ma tu na razie nic nadzwyczajnego. Ta klasa macierzysta zawiera dwie metody umoliwiajce dyrektorowi zarzdzanie pracownikami oraz wypacanie im pensji, czyli to, czego
nie robi inynierowie.

'# 

;'#
#('$ 

 ;'##('$ ( ';'#
 !#"#
 !'$ "'$ 
&

Rozdzia 5.

Programowanie obiektowe w PHP4

159


  # #
 'D
 #B# $
&

  *#'W ';'#

# ! ';'#
&
&
!

Klasa ;
 udostpnia metod definiujc projekty prowadzone przez inyniera. Chcc
zdefiniowa klas implementujc dyrektora technicznego, oczekujemy, e bdzie zarzdza inynierami, zatwierdza ich listy pac i rozdziela im projekty. Zastosujmy wic nasz
sztuczk z dziedziczeniem i delegacj, aby zasymulowa wielokrotne dziedziczenie.


U# 8#

'#R# U# 
'#

Klasa 5
$
 dziedziczy po klasie 5
, wic zawiera te same atrybuty oraz
metody co klasa macierzysta. Aby udostpni mechanizmy klasy ;
, zagniedzimy
klas ;
 wewntrz klasy 5
$
, a w konstruktorze umiecimy inicjacj
tego obiektu:

 U# 8#

'#('$ ( ';'#
U# MMU# #('$ 
 !'#"#$;'##('$ ( ';'#
&

  # #
 !'# ! # #
&

  *#'W ';'#
# !'# ! *#'8;'#
&
&
 # 8#

'"#$U# 8#

'<=<(< $ <(<G#
<
!

Takie rozwizanie zapewnia wystpienie obiektu klasy ;


 w kadym obiekcie klasy
5
$
. Aby udostpni metod 2
2, po prostu delegujemy j do osadzonego obiektu 
:

  # #
 !'# ! # #
&

Aby udostpni metod 


<2;
, postpujemy podobnie:

  *#'W ';'#
# !'# ! *#'W ';'#
&

Dziki temu kady egzemplarz klasy 5


$
 bdzie udostpnia metody obu
klas. Zastosowanie przedstawionego sposobu znacznie si komplikuje, gdy chcemy jednoczenie dziedziczy po wikszej liczbie klas, dlatego bardzo trudno byoby tworzy nowe

160

PHP4. Zaawansowane programowanie


klasy i dziedziczy po rnych kombinacjach klas. Podana przez nas metoda powinna by
stosowana z rozwag, poniewa mamy nadziej, e w przyszych wersjach PHP opcja wielokrotnego dziedziczenia bdzie ju dostpna.
Podana metoda moe pomc w rozwizaniu niektrych problemw, lecz wraz ze wzrostem liczby klas, po ktrych chcemy dziedziczy, kod moe sta si mniej czytelny
i trudniejszy w dalszym rozwoju.

Modelowanie zoonego komponentu WWW


W tym podrozdziale zaprojektujemy mechanizm omwionego wczeniej formularza WWW.
Przy tej okazji przekaemy kilka dodatkowych sposobw realizacji struktury obiektw oraz
kilka ukadw projektowych, ktre mog by uyteczne w realizowanych projektach. Zdefiniujmy wymagania dotyczce naszego mechanizmu. Mechanizm ten powinien:


umoliwia tworzenie kilku formularzy na stronie;

umoliwia zmian wygldu formularzy bez modyfikacji logiki formularza;

udostpnia jednolity interfejs sucy do dodawania elementw formularza


oraz przyciskw;

udostpnia weryfikacj danych po stronie uytkownika (z uyciem JavaScriptu)


oraz weryfikacj po stronie serwera (z uyciem wyrae regularnych);

udostpnia kilka standardowych definicji weryfikacji najczciej spotykanych


danych, na przykad adresw e-mail;

umoliwia wypisywanie etykiet wymaganych pl pogrubion czcionk;

umoliwia ponowne wypisanie formularza z zaznaczeniem bdnie wypenionych


elementw;

automatycznie wypisywa bdy, bez formatowania;

wykonywa wszystkie wymienione wyej zadania za pomoc pojedynczego


skryptu PHP.

Na pierwszy rzut oka moe wydawa si, e realizacja powyszych zada wymaga utworzenia skomplikowanego moduu. Jednak dziki odpowiedniemu projektowi architektury
moemy osign zadowalajce wyniki bez wprowadzania zbdnej komplikacji. W rzeczywistoci istnieje bardziej elastyczny projekt mechanizmu formularzy, ni ten, ktry chcemy
zademonstrowa, jednake wymaga on zastosowania wielu klas zewntrznych. Celem naszego przykadu jest zademonstrowanie wszystkich koncepcji, ktre przedstawilimy do tej
pory. Chcemy pokaza, w jaki sposb mona rozwiza problem utworzenia mechanizmu
formularza WWW z zastosowaniem obiektw.
Na pocztku naley zdefiniowa klas %, poniewa to ona jest gwn klas w naszym mechanizmie. % powinien umie wypisa swoj zawarto, uywajc definicji
stylu, dodawa elementy i przyciski, tworzy kod weryfikujcy dane w JavaScripcie dziaajcy
po stronie klienta, weryfikowa swoje dane po stronie serwera, a take wypisywa komunikat o bdzie w przypadku problemw z weryfikacj danych.

Rozdzia 5.

Programowanie obiektowe w PHP4

161

Nastpnie potrzebna nam bdzie struktura obiektw modelujca wszelkie moliwe elementy formularzy oraz przyciski. Zastosujemy klas macierzyst o nazwie &

 %
 i rozszerzymy j za pomoc dziedziczenia tak, aby obejmowaa wszystkie elementy
formularza. Takimi elementami mog by pola tekstowe, pola daty, due pola tekstowe, hasa, pola wysyki plikw czy te listy wielokrotnego wyboru. Tworzc klas macierzyst
&

 % i wykorzystujc moliwoci polimorfizmu, moemy dodawa dowoln
liczb typw elementw formularza bez koniecznoci modyfikacji logiki definiujcej wypisywanie, weryfikacj oraz generowanie kodu w JavaScripcie. Przyjrzyjmy si naszemu modelowi obiektowemu:
Formularz
dodajElement()
dodajPrzycisk()
weryfikuj()
wypisz ()
generujJ avaScript()
ustalStyl()
pobierzKomunikatOBledzie()

PoleTekstowe

PoleHasa

DuePoleTekstowe

Tablica
elementw
formularza

ElementFormularza
wypiszElementFormularza()
wypisz()
pobierzParametrHtml()

PoleUkryte

WyborPliku

PoleDaty

ListaWyboru
dodaj()
ustalWielokrotnyWybor()

GrupaPrzelacznikow
dodaj()

ListaWielokrotnegoWyboru
pobierzH tml()

GrupaOpcji
pobierzHtml()

Ten model wykorzystuje niemal t sam standardow hierarchi zagniedania i dziedziczenia, ktr omwilimy przy okazji omawiania wczeniejszych przykadw w tym rozdziale, z dwoma wyjtkami. Po pierwsze, schemat pokazuje, e elementy formularza nie s
zawarte w obiekcie formularza. Chocia fizycznie elementy s skadowymi formularza, zachowuj si inaczej w momencie jego utworzenia. Dodalimy metody 2&

  oraz
2#  suce do dodawania elementw do formularza. Formularz nie posiadajcy elementw jest nadal penoprawnym, cho niezbyt uytecznym obiektem klasy.
Druga komplikacja dotyczy zwizkw zawierania oraz metody 2 w klasach = 7
 oraz = 7
  
7. Pozwala to na dodawanie elementw do pola wyboru
w ten sam sposb, w jaki mona to zrobi w przypadku formularza. Mechanizm ten jest
praktycznie przezroczysty dla programisty. Znaczenie naszego kodu polega na tym, e metoda  kadej z klas potomnych klasy &

 % moe zosta zrealizowana
w dowolny sposb. Moemy wypisa znaczniki elementw pola wyboru w dowolny sposb, nie naruszajc adnej z zasad opisanych w modelu dziedziczenia. Mniejsze, lecz podobne modele dziedziczenia moemy zdefiniowa dla przyciskw:

162

PHP4. Zaawansowane programowanie


Formularz
dodajElement()
dodajPrzycisk()
weryfikuj()
wypisz()
generujJavaScript()
ustalStyl()
pobierzKomunikatOBledzie()

Tablica
elementw
formularza

ElementFormularza
wypiszElementFormularza()
wypisz()

PrzyciskZatwierdzajacy

PoleDaty

Posiadamy ju solidny fundament dla struktur formularzy, lecz w jaki sposb zadba o ich
atrakcyjny wygld? Zastosujemy osobn klas  %, co pozwoli nam na dowolne
definiowanie stylu formularza. W naszym przypadku zdecydowalimy si na wykorzystanie HTML-u. Czsto logika prezentacji jest umieszczana w tym samym miejscu, co logika
aplikacji, lecz nie jest to dobra praktyka. Komponenty stylu lub elementy dekoracyjne pozwalaj na umieszczenie logiki prezentacji osobno, dziki czemu nasz obiekt jest bardziej
spjny. Dodatkow korzyci pync z oddzielenia elementw dekoracyjnych od logiki
obiektu jest to, e mona zmieni sposb prezentacji obiektu bez zmiany logiki obiektu, dziki czemu atwiej go rozbudowywa i stosowa w nowym projekcie.
W celu zdefiniowania stylu formularzy wykorzystamy moliwo delegacji. Jednym ze stosowanych ukadw projektowych jest zastosowanie zewntrznego obiektu dekoratora.
Dziki strukturalnej naturze jzyka HTML atwo jest zrealizowa tak funkcj za pomoc
obiektu osadzonego. Dziki temu diagram przepywu informacji pomidzy obiektami jest
o wiele czytelniejszy bez negatywnych efektw ubocznych, poniewa moemy osign te
same moliwoci, co w przypadku zastosowania zewntrznego obiektu dekoratora.
Klasa  % zostaa rozszerzona o trzy klasy potomne. Klasa  5 jest
wykorzystywana przez konstruktor klasy %. Pozostae dwie klasy reprezentuj dowolne style, ktre mona zastpi wasnymi, w zalenoci od upodoba. Dziki takiemu
projektowi moemy tworzy efektowne formularze, definiujc nowe obiekty stylu.
  ' !$ #$ :'
  ' !$'

Oto diagram w UML-u przedstawiajcy formularz z komponentem definicji stylu:


Formularz
dodajElement()
dodajPrzycisk()
weryfikuj()
wypisz()
generujJavaScript()
ustalStyl()
pobierzKomunikatOBledzie()

StylFormularza
wypiszN aglowekFormularza()
wypiszStopkeFormularza()
wypiszElementNaglowka()
wypiszElementStopki()
wypiszPrzyciskNaglowka()
wypiszPrzyciskStopki()

StylDomyslny

StylKlasyczny

StylFantazyjny

Rozdzia 5.

Programowanie obiektowe w PHP4

163

Jeli chcemy zmodyfikowa kolorystyk, moemy powyszy zapis zmodyfikowa nastpujco:


  ' !$ #$> $ 
  ' !$'

Dziki temu nie ma potrzeby przeprowadzania jakiejkolwiek modyfikacji w ramach logiki


aplikacji.
Przedostatni element stanowi obiekt weryfikacji danych formularza. Omawiajc delegacj,
stworzylimy ju odpowiedni klas. Model obiektowy tej klasy przedstawiamy na kolejnym diagramie:
Formularz
dodajElement()
dodajPrzycisk()
weryfikuj()
wypisz()
generujJavaScript()
ustalStyl()
pobierzKomunikatOBledzie()

WeryfikatorDanych
dodaj()
weryfikuj()
pobierzKomunikatOBledzie()
pasuje()

Aby zarzdza wieloma formularzami, potrzebujmy wspomnianej wczeniej klasy ,



%, ktra jest nasz ostatni klas. ,
% bdzie narzdziem sucym do zarzdzania wiksz liczb formularzy i posuy do odtwarzania kodu JavaScript.
Klasa ta dziaa rwnie jako klasa fabryczna, poniewa moemy tworzy formularze za jej
pomoc. Oto diagram przedstawiajcy model obiektowy klasy ,
%:
MechanizmFormularzy
utworz()
wypiszKodBiliotekiJavaScript()

Tablica
formularzy

Formularz
dodajElement()
dodajPrzycisk()
weryfikuj()
wypisz()
generujJavaScript()
ustalStyl()
pobierzKomunikatOBledzie()

Powodem, dla ktrego obiekt klasy ,


% tworzy formularze, jest moliwo kontroli przeze zalenoci okrelajcych kod JavaScript niezbdny do realizacji zada formularzy. Jest to potrzebne dla implementacji mechanizmu weryfikacji poprawnoci
danych po stronie klienta. W tym momencie nasz mechanizm jest ju prawie ukoczony.
Poniej przedstawiamy kod demonstrujcy atwo wykorzystania naszego modelu w celu
utworzenia formularza, ktry przedstawilimy wczeniej:
#
':  '"#$G#
':  '
  '"#
':  ' !$ '<  '<(<>'$:  '<(
7F769O:(< <
  ' ! 9 ###$>+ $#:  '<; 
# +5 #<
  ' ! 9 ###$7 #8# $#<#6'$ <(<<(
<;,'$ <(PO7FP(
<S#'$<(#
  ' ! 9 ###$7 #3#< 3' $<(<-<

164

PHP4. Zaawansowane programowanie


  ' ! 9 ###$7 #F < <(<<(<F) <(7PLNWU(
<F) ) C,
#'
'##
'5$<(
#
  ' ! 9 ###$7 #8# $#<# -(<<(<P ##  <(9GP;O(
<>#$ ) $ ##  <(
#
  ' ! 9 ###$U'#7 #8# $#< <(<<(<N<(PO7FP>3G9W;E(
<S   *<( #(
< $<"!-/(
<
<"!@/(
  ' ! 9 ###$7 #U< 6' #<(<<(
<U' #<( #
  ' ! 9 ###$L* 7 < <(<7 <( #
$* "#$OL* < '6$<(<<(<W '$<(#
$*  ! <Z ' $<(<Z<
$*  ! <G#,
'<(<G<
  ' ! 9 ##$* 
$* "#$OL#  #+ L* < $ <( $ (< $ <(
 #
$*  ! <7 <(<7<
$*  ! <U# <(<U<
$*  ! <;B#<(<;<
$*  ! <P <(<P<&
  ' ! 9 ##$* 
  ' ! 7'
#$7'
%$# '
<$ <(<LA <
  ' ! 7'
#$7'
%#
<$
'
<(<L
'AC<
$ ""<LA <
 #7 $#"  ' !$#
 #7 $#
#
 <$ 'D <
'#$'# 
$*'# 

&# #
#
   ' ! *#' NS # '#
  ' !$'
#
':  ' !$' S  #=

#
   ' !+## =

&
&# #
#
':  ' !$' S  #=

  ' !$'
#
   ' !+## =

&

Ojej, nie ma ani kawaka kodu implementacji? Co robi? Na to pytanie atwo odpowiedzie
napisz to. Jeli masz zamiar nauczy si programowania zorientowanego obiektowo
i doceniasz koncepcje, ktre tutaj poznae, Twoim pierwszym zadaniem powinno by dokoczenie tego moduu. Nie bdzie to strata czasu, poniewa bdziesz mg wykorzysta
ten kod w wielu programach. Poegnaj si z tymi wszystkimi darmowymi moduami znajdowanymi w Sieci i zacznij stosowa elementy utworzone wasnorcznie.

You might also like