Po prostu PHP. Techniki zaawansowane

639 views

Published on

Język programowania PHP stanowi dla wielu osób przepustkę w świat pisania aplikacji działających po stronie serwera WWW. Łatwość z jaką przychodzi nauczenie się tego języka, sprawiła, że używają go setki tysięcy amatorów i profesjonalistów na całym świecie.

Po pewnym czasie wiedza wyniesiona z podręczników opisujących podstawy PHP języka przestaje wystarczać. Niniejsza książka pomoże Ci w wykonaniu kolejnego kroku: kroku w kierunku pisania zaawansowanych aplikacji. Dzięki niej wzbogacisz swoją wiedzę i staniesz się prawdziwym ekspertem programowania w PHP, poszukiwanym na rynku pracy.

* Poznasz tajniki programowania obiektowego.
* Nauczysz się korzystać z baz danych.
* Dowiesz się, w jaki sposób zabezpieczać stworzone przez siebie aplikacje.
* Napiszesz własny sklep internetowy, korzystając z sesji i bazy SQL.
* Poznasz sposoby uruchamiania programów PHP w oderwaniu od serwera WWW.
* Nauczysz się generować nie tylko strony WWW, ale także grafikę i pliki PDF.
* Dowiesz się, jak i po co używać języka XML.
* Skorzystasz z wielu rozszerzeń języka, które ułatwiają rozwiązywanie złożonych problemów.

Pomoże Ci w tym prosty język w jakim napisana jest książka oraz liczne przykłady kodu, a także osoba autora, doświadczonego programisty i wykładowcy PHP na Uniwersytecie Kalifornijskim w Berkeley.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Po prostu PHP. Techniki zaawansowane

  1. 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI Po prostu PHP. Techniki zaawansowane KATALOG KSI¥¯EK Autor: Larry Ullman KATALOG ONLINE T³umaczenie: Rados³aw Meryk ISBN: 83-7197-775-1 ZAMÓW DRUKOWANY KATALOG Tytu³ orygina³u: PHP Advanced For The World Wide Web. Visual QuickPro Guide Format: B5, stron: 492 TWÓJ KOSZYK DODAJ DO KOSZYKA Jêzyk programowania PHP stanowi dla wielu osób przepustkê w wiat pisania aplikacji dzia³aj¹cych po stronie serwera WWW. £atwo æ z jak¹ przychodzi nauczenie siê tego jêzyka, sprawi³a, ¿e u¿ywaj¹ go setki tysiêcy amatorów i profesjonalistów na ca³ym CENNIK I INFORMACJE wiecie. Po pewnym czasie wiedza wyniesiona z podrêczników opisuj¹cych podstawy PHP ZAMÓW INFORMACJE jêzyka przestaje wystarczaæ. Niniejsza ksi¹¿ka pomo¿e Ci w wykonaniu kolejnego O NOWO CIACH kroku: kroku w kierunku pisania zaawansowanych aplikacji. Dziêki niej wzbogacisz swoj¹ wiedzê i staniesz siê prawdziwym ekspertem programowania w PHP, ZAMÓW CENNIK poszukiwanym na rynku pracy. • Poznasz tajniki programowania obiektowego. • Nauczysz siê korzystaæ z baz danych. CZYTELNIA • Dowiesz siê, w jaki sposób zabezpieczaæ stworzone przez siebie aplikacje. • Napiszesz w³asny sklep internetowy, korzystaj¹c z sesji i bazy SQL. FRAGMENTY KSI¥¯EK ONLINE • Poznasz sposoby uruchamiania programów PHP w oderwaniu od serwera WWW. • Nauczysz siê generowaæ nie tylko strony WWW, ale tak¿e grafikê i pliki PDF. • Dowiesz siê, jak i po co u¿ywaæ jêzyka XML. • Skorzystasz z wielu rozszerzeñ jêzyka, które u³atwiaj¹ rozwi¹zywanie z³o¿onych problemów. Pomo¿e Ci w tym prosty jêzyk w jakim napisana jest ksi¹¿ka oraz liczne przyk³ady kodu, a tak¿e osoba autora, do wiadczonego programisty i wyk³adowcy PHP na Uniwersytecie Kalifornijskim w Berkeley. Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl
  2. 2. Spis treści Spis treści WSTĘP 9 Rozdział 1. Zaawansowane programowanie w PHP 19 Struktura i dokumentowanie kodu ............................................................ 20 Tablice ...................................................................................................... 28 Stałe .......................................................................................................... 37 Funkcje rekurencyjne i zmienne statyczne ............................................... 42 Funkcje a odwołania ................................................................................. 52 Rozdział 2. Programowanie obiektowe 59 Definiowanie klas ..................................................................................... 61 Tworzenie obiektu .................................................................................... 64 Tworzenie konstruktorów ......................................................................... 70 Spis treści Dziedziczenie............................................................................................ 76 U ycie metod klas bez ich egzemplarzy ................................................... 82 Szeregowanie obiektów ............................................................................ 84 Usuwanie obiektów................................................................................... 93 Rozdział 3. Bazy danych 97 Projekt bazy danych i normalizacja .......................................................... 99 Tworzenie bazy danych .......................................................................... 108 Generowanie wyników zapytań .............................................................. 113 Rozdział 4. Bezpieczeństwo 139 Sprawdzanie poprawności danych w formularzach................................ 141 Sprawdzanie danych w formularzu za pomocą skryptów JavaScript ..... 155 Mcrypt..................................................................................................... 164 Uwierzytelnianie HTTP .......................................................................... 175 Bezpieczeństwo serwera WWW............................................................. 181 Rozdział 5. Projektowanie aplikacji WWW 185 Projekt bazy danych................................................................................ 186 Struktura ośrodka .................................................................................... 190 PHP a szablony obiektowe...................................................................... 202 5
  3. 3. Spis treści Obsługa sesji ........................................................................................... 224 Wykorzystanie sesji bez znaczników cookie .......................................... 233 Uruchamianie diagnostyczne .................................................................. 243 Rejestrowanie i zgłaszanie błędów ......................................................... 244 Rozdział 6. E-commerce 247 Tworzenie bazy danych .......................................................................... 249 Administracja.......................................................................................... 255 Wyświetlanie towarów online................................................................. 271 Implementacja koszyka na zakupy ......................................................... 279 Rozdział 7. PHP w sieci 289 Wykrywanie przeglądarki ....................................................................... 290 Dostęp do innych ośrodków WWW za pomocą PHP............................. 298 Wykorzystanie fsockopen() .................................................................... 303 Rozdział 8. PHP a serwer 309 Uruchamianie skryptów za pomocą usługi cron ..................................... 310 Kompresja plików za pomocą PHP ........................................................ 317 Spis treści Wykorzystanie modułu COM w PHP..................................................... 322 Rozdział 9. XML i PHP 331 Czym jest XML?..................................................................................... 332 Składnia języka XML ............................................................................. 334 Definicje typu dokumentów.................................................................... 337 Analiza dokumentów XML za pomocą PHP oraz Expat........................ 344 Obsługa błędów w XML......................................................................... 351 Rozdział 10. Generowanie grafiki 355 Tworzenie prostej grafiki ........................................................................ 357 Zastosowanie czcionek TrueType........................................................... 368 Tworzenie wykresów na podstawie danych z bazy danych.................... 376 Zapisywanie i modyfikowanie istniejących grafik ................................. 387 Rozdział 11. Tworzenie plików PDF 395 Tworzenie prostego dokumentu PDF ..................................................... 397 Wprowadzanie tekstu w dokumentach PDF ........................................... 403 Rysowanie figur ...................................................................................... 416 Wykorzystanie ilustracji graficznych...................................................... 424 Tworzenie wielostronicowych dokumentów PDF .................................. 431 6
  4. 4. Spis treści Rozdział 12. Rozszerzenia PHP 439 PEAR ...................................................................................................... 440 Zend ........................................................................................................ 447 PHP-GTK................................................................................................ 451 Kod źródłowy PHP ................................................................................. 464 Dodatek A Instalacja 465 Instalacja PHP wraz z serwerem Apache w systemie Linux .................. 466 Instalacja PHP z serwerem Xitami w systemie Windows ...................... 472 Dodatek B Bazy danych 475 Aplikacje systemów zarządzania bazami danych ................................... 476 SQL......................................................................................................... 477 Informacje dotyczące bazy danych MySQL........................................... 480 Inne zasoby ............................................................................................. 482 Dodatek C Zasoby ogólne 483 Ośrodki WWW poświęcone PHP ........................................................... 484 Spis treści Dodatkowe biblioteki.............................................................................. 486 Bezpieczeństwo....................................................................................... 488 Inne zasoby ............................................................................................. 489 Skorowidz 493 7
  5. 5. Zaawansowane Zaawansowane programowanie w PHP programowanie w PHP Zaawansowane programowanie w PHP Na najprostszym poziomie dobre programowanie wyra a się tym, czy aplikacja lub skrypt działa zgodnie z zamiarem. Początkujący programiści pozostaną na tym poziomie i nie ma w takim podejściu nic złego. Jednak e zaawansowany programista będzie próbował pójść nieco dalej. Będzie dą ył do zapewnienia lepszej wydajności, niezawodności, bezpieczeństwa i przenośności. Ta ksią ka nauczy nas, w jaki sposób rozwinąć umiejętności zaawansowanego programisty PHP. Ten rozdział opisuje niektóre nowe funkcje i właściwości języka PHP Zaawansowane programowanie w PHP w wersji 4., techniki, jakie będą stosowane w tej ksią ce, oraz kilka wskazówek i sztuczek rzemiosła. Chocia zapewne ju wiemy, w jaki sposób korzystać z tablic, to prawdopodobnie jeszcze nie znamy konstrukcji HQTGCEJ lub starszej, ale wcią bardzo u ytecznej funkcji CTTC[AYCNM . Prawdopodobnie mieliśmy ju okazję zapisać własną funkcję, ale być mo e nie do końca wiemy, w jaki sposób wykorzystywać rekurencję oraz zmienne statyczne. W rozdziale tym opiszemy te elementy, a tak e inne podstawowe informacje, jak: dokumentowanie kodu, tworzenie jego struktury, stałe oraz powiązania. Wyjaśnimy te ró nice pomiędzy wykorzystaniem funkcji RTKPV a funkcji GEJQ , a tak e w jaki sposób tworzyć aliasy zmiennych — technikę, która jest nowa dla języka PHP w wersji 4. Ostatecznie w procesie pisania przykładowych skryptów dowiemy się, e mo na tworzyć dynamiczne aplikacje WWW, stosując bazę danych w prostym pliku tekstowym. W rozdziale tym utworzymy kilka skryptów, słu ących do utworzenia i zarządzania ośrodkiem totalizatora sportowego online, gdzie u ytkownicy odgadują zwycięskie zespoły. W ka dym tygodniu oraz w całym sezonie obliczany jest współczynnik poprawnych typów dla ka dego z u ytkowników. Wymaga to wykonania niewielu czynności administracyjnych. Wybrałem ten przykład nie ze względu na to, e odpowiada tematowi, ale równie dlatego, e sięga on czasów moich początków w PHP. Nauczyłem się tego języka (po przejściu z języka Perl) przy okazji tworzenia podobnej aplikacji. Oczywiście wtedy zakończyłem pracę, kiedy tylko skrypt zaczął działać. Nie muszę dodawać, e skrypty zaprezentowane w tym rozdziale są bardziej wydajne, niezawodne, bezpieczne oraz przenośne ni te skrypty, które opracowałem wtedy. 19
  6. 6. Rozdział 1. Skrypt 1.1. Ten skrypt będzie działać prawidłowo, Struktura ale znacznie trudniej go poprawiać i zrozumieć ni i dokumentowanie kodu skrypt 1.2 Właściwa struktura kodu oraz jego 1%6;2' JVON 27$.+% 9%6 :*6/. dokumentowanie, mimo e nie ma wpływu 6TCPUKVKQPCN2. na działanie aplikacji, stanowi podstawę JVVRYYYYQTI644'%ZJVON zaawansowanego programowania w PHP. 6ZJVONVTCPUKVKQPCNFVF Właściwa struktura oraz dokumentowanie JVON ZONPU JVVRYYYYQTIZJVON jest elementem, który nale y zastosować JGCF VKVNG 6QVCNKCVQT RK MCTUMKVKVNG dla wygody własnej oraz naszych klientów JGCF i współpracowników, a tak e dla programisty, DQF[ który w przyszłości będzie być mo e zmuszony !RJR UETKRVAARJR poprawiać nasz kod. FGHKPG 9 Y HWPEVKQP YTKVGAFCVC X M HR ] Kiedy piszę o strukturze kodu, mam na myśli UVCVKE HN sposób fizycznej organizacji kodu PHP w samym KH HN ] HRWVU HR 9KGTU CVTCRCP Struktura i dokumentowanie kodu dokumencie (W rozdziale 5., „Projektowanie aplikacji WWW” omówię zagadnienie szersze HN 647' _ — strukturę witryny). Porównajmy skrypty 1.1 HRWVU HR XP oraz 1.2. Obydwa są poprawnymi dokumentami _ PHP, ale który z nich wolelibyśmy przeglądać H RKEMUA 9 A9KPPGTUAVZV i poprawiać? KH HR HQRGP H Y ] CTTC[AYCNM Y YTKVGAFCVC HR Podstawy budowania struktury kodu odnoszą HENQUG HR się do sposobu stosowania wcięć w kodzie, GEJQ CRKUCPQ Y[EKúEÎY DT DT pozostawiania pustych wierszy, u ywania _ GNUG ] GEJQ 0KG OQ PC QVYQT[è RNKMW H nawiasów zwykłych i klamrowych itp. 0CNG [ WRGYPKè UKú G OKGPPC OC YCTVQ è Ogólne zasady są następujące: DT DT u nale y stosować wcięcia bloków kodu _ HWPEVKQP TGCFARKEMU FR F ] (np. wyników instrukcji warunkowych INQDCN R lub zawartość funkcji) o szerokości jednej KH HP TGCFFKT FR ] tabulacji lub czterech spacji (w zasadzie KH UWDUVT HP RKEMUA ] powinno się stosować spacje, a nie tabulatory, RHP GZRNQFG A HP ale programiści stosują wygodniejsze KH RHP=? 9 CPF RHP=? 9KPPGTU ] tabulacje); WP RHP=? u określone fragmenty kodu nale y oddzielać VH F HP pustym wierszem, aby wyró nić je wizualnie; WR HKNG VH R= WP? WR u nale y wprowadzać spacje pomiędzy _ słowami, argumentami funkcji, operatorami _ TGCFARKEMU FR F itp. (generalnie, choć nie zawsze, w języku _ PHP liczba spacji nie ma znaczenia); _ R CTTC[ u funkcje nale y umieszczać na początku F dokumentu. 20
  7. 7. Zaawansowane programowanie w PHP Skrypt 1.1. ciąg dalszy Po utworzeniu struktury naszego kodu powinniśmy zapewnić, aby był on dobrze FR QRGPFKT F udokumentowany. Dokumentowanie kodu jest TGCFARKEMU FR F programowym odpowiednikiem umieszczania ENQUGFKT FR notatek na ółtych, samoprzylepnych karteczkach. Mo na zaryzykować stwierdzenie, YJKNG NKUV M X GCEJ R ] e dokumentowania pracy nigdy za du o. YU NU Nale y opisać działanie funkcji, zmiennych, YJKNG NKUV M X GCEJ X ] fragmentów kodu oraz całych stron. W skrypcie X UWDUVT X UVTNGP X 1.3 pokazałem, jak wyglądałby skrypt 1.2, KH X Y= M? CPF M ] gdyby zawierał komentarze. Oto kilka rad YU dotyczących dokumentowania kodu: _ GNUGKH M ] NU u zapisujmy przeznaczenie zmiennych, chyba _ e ich przeznaczenie nie jest oczywiste _ nawet dla początkujących programistów; T= M? CTTC[ YU YU NU NU _ u opisujmy zastosowanie funkcji; Struktura i dokumentowanie kodu MUQTV T HWPEVKQP YTKVGATGUWNVU X M HR ] u wyjaśniajmy, jaki jest cel działania UVCVKE HN fragmentów kodu; KH HN ] HRWVU HR 7 [VMQYPKMVYUVNUP u wymieniajmy pliki, z którymi program się HN 647' komunikuje, których wymaga itp.; _ F KORNQFG V X u oznaczajmy zamykające nawiasy klamrowe HRWVU HR MV FP dla zło onych funkcji oraz struktur sterujących (instrukcji warunkowych, pętli itp.). H TGUWNVUA 9 AVZV KH HR HQRGP H Y ] CTTC[AYCNM T YTKVGATGUWNVU HR HENQUG HR COMPKúEKG RNKMW GEJQ CRKUCPQ Y[PKMKDT DT _ GNUG ] GEJQ 0KG OQ PC WVYQT[è RNKMW V[IQFPKQY[OK Y[PKMCOK HDT DT _ ! DQF[ JVON 21
  8. 8. Rozdział 1. Skrypt 1.2. Wstawienie pustych wierszy i tabulatorów Skrypt 1.2. ciąg dalszy znacznie zwiększa czytelność skryptu 1%6;2' JVON 27$.+% 9%6 :*6/. RCTUGAHKNGAPCOG GZRNQFG 6TCPUKVKQPCN2. A HKNGAPCOG JVVRYYYYQTI64 4'%ZJVON6ZJVON KH RCTUGAHKNGAPCOG=? VTCPUKVKQPCNFVF 9''- CPF RCTUGAHKNGAPCOG=? JVON ZONPU JVVRYYYYQTIZJVON 9KPPGTU ] JGCF VKVNG 6QVCNKCVQT RK MCTUMK VKVNG WUGTPCOG JGCF RCTUGAHKNGAPCOG=? DQF[ VJGAHKNG FKTGEVQT[ !RJR HKNGAPCOG WUGTUARKEMU HKNG FGHKPG 9''- YGGM VJGAHKNG RKEMU= WUGTPCOG? HWPEVKQP YTKVGAFCVC XCNWG MG[ HR ] WUGTUARKEMU _ Struktura i dokumentowanie kodu UVCVKE HKTUVANKPG _ KH HKTUVANKPG ] TGCFARKEMU FR FKTGEVQT[ HRWVU HR 9KGTU CVTCRC P _ HKTUVANKPG 647' _ _ RKEMU CTTC[ HRWVU HR XCNWGP _ FKTGEVQT[ FR QRGPFKT FKTGEVQT[ HKNG RKEMUA 9''- TGCFARKEMU FR FKTGEVQT[ A9KPPGTUAVZV ENQUGFKT FR KH HR HQRGP HKNG Y ] YJKNG NKUV MG[ XCNWG GCEJ CTTC[AYCNM YKPPGTU YTKVGAFCVC RKEMU ] HR HENQUG HR YKPU NQUUGU GEJQ CRKUCPQ Y[EKúEÎY DT DT YJKNG NKUV MG[ XCNWG GCEJ XCNWG ] _ GNUG ] GEJQ 0KG OQ PC QVYQT[è RNKMW H XCNWG UWDUVT XCNWG 0CNG [ WRGYPKè UKú G OKGPPC OC UVTNGP XCNWG YCTVQ è DT DT KH XCNWG YKPPGTU= MG[? _ CPF MG[ ] YKPU HWPEVKQP TGCFARKEMU FR FKTGEVQT[ ] _ GNUGKH MG[ ] NQUUGU INQDCN RKEMU _ _ KH HKNGAPCOG TGCFFKT FR ] TGUWNVU= MG[? CTTC[ YKPU KH UWDUVT HKNGAPCOG YKPU NQUUGU NQUUGU RKEMUA ] _ 22
  9. 9. Zaawansowane programowanie w PHP Skrypt 1.2. ciąg dalszy Skrypt 1.3. Ta wersja skryptu 1.2 została właściwie udokumentowana, ale oczywiście jest miejsce na dodanie dodatkowych notatek MUQTV TGUWNVU !RJR UETKRVAARJR
  10. 10. HWPEVKQP YTKVGATGUWNVU XCNWG MG[ 5KGEKQY[ U[UVGO VQVCNKCVQTC HR ] RK MCTUMKGIQ UVCVKE HKTUVANKPG 1RTCEQYC .CTT[ ' 7NNOCP KH HKTUVANKPG ] CRKUCPQ 5KGTRKG HRWVU HR 7 [VMQYPKMV6[R[ 2QRTCYKQPQ UKGTRPKC RQRTCYPGV6[R[ D úFPGP HKTUVANKPG 647' -QPVCEV RJR/%KPUKIJVUEQO _ 5VTQPC RTQEGUUAYKPPGTURJR QDU WIWLG FCVC KORNQFG V XCNWG UVTQPú RKEMAYKPPGTURJR RCIG HRWVU HR MG[V FCVCP Struktura i dokumentowanie kodu 1MTG NC QPC UMWVGEPQ è V[RÎY RQUEGIÎNP[EJ ITCE[ K CRKUWLG VG KPHQTOCELG Y RNKMW VGMUVQY[O HKNG TGUWNVUA 9''- AVZV
  11. 11. ! KH HR HQRGP HKNG Y ] 1%6;2' JVON 27$.+% 9%6 :*6/. 6TCPUKVKQPCN2. CTTC[AYCNM TGUWNVU JVVRYYYYQTI644'%ZJVON YTKVGATGUWNVU HR 6ZJVONVTCPUKVKQPCNFVF HENQUG HR COMPKúEKG RNKMW JVON ZONPU JVVRYYYYQTIZJVON GEJQ CRKUCPQ Y[PKMKDT DT JGCF VKVNG 6QVCNKCVQT RK MCTUMKVKVNG _ GNUG ] JGCF DQF[ GEJQ 0KG OQ PC QVYQT[è RNKMW !RJR V[IQFPKQY[OK Y[PKMCOK HKNGDT DT 7UVCYKGPKG UVC GL YGGM _ FGHKPG 9''- YGGM ! DQF[
  12. 12. JVON
  13. 13. CRKU Y[EKúEÎY Y RNKMW
  14. 14. HWPEVKQP YTKVGAFCVC XCNWG MG[ HR ] (WPMELC YTKVGAFCVC CRKUWLG V[R[ Y RNKMW UVCVKE HKTUVANKPG KH HKTUVANKPG ] CRKUCPKG RKGTYUGIQ YKGTUCCVTCR[ CNG V[NMQ TC HRWVU HR 9KGTU CVTCRCP HKTUVANKPG 647' _ 23
  15. 15. Rozdział 1. Skrypt 1.3. ciąg dalszy Skrypt 1.3. ciąg dalszy HRWVU HR XCNWGP QFCPKG PCMW TGVWTP CD[ MC F[ CRKU PCNC WUGTPCOG UKú Y QUQDP[O YKGTUW RCTUGAHKNGAPCOG=? _ VJGAHKNG FKTGEVQT[ HKNGAPCOG HKNG RKEMUA 9''- WUGTUARKEMU HKNG A9KPPGTUAVZV 9UMCCPKG PCY[ VJGAHKNG RNKMW Y HQTOCEKG RKEMUAA9KPPGTUAVZV RKEMU= WUGTPCOG? WUGTUARKEMU KH HR HQRGP HKNG Y ] _ 2TGE[VCPKG RNKMW FQ VCDNKE[ _ CTTC[AYCNM YKPPGTU YTKVGAFCVC TGCFARKEMU FR FKTGEVQT[ HR 9[U CPKG EC GL VCDNKE[ -QNGLPC KVGTCELC HWPMELK FQ HWPMELK YTKVGAFCVC _ HENQUG HR COMPKúEKG RNKMW _ Struktura i dokumentowanie kodu GEJQ CRKUCPQ Y[EKúEÎY DT DT RKEMU CTTC[ CKPKELQYCPKG I ÎYPGL OKGPPGL _ GNUG ] 9[ YKGVNGPKG D úFW Y RT[RCFMW IF[D[ QVYCTEKG RNKMW D[ Q PKGOQ NKYG FKTGEVQT[ GEJQ 0KG OQ PC QVYQT[è RNKMW HKNG FR QRGPFKT FKTGEVQT[ 2TQUú WRGYPKè UKú G OKGPPC YGGM TGCFARKEMU FR FKTGEVQT[ OC YCTVQ èDT DT ENQUGFKT FR _
  16. 16. 1DNKEGPKG V[IQFPKQY[EJ Y[PKMÎY
  17. 17. 2QDTCPKG V[RÎY ITCE[
  18. 18. YJKNG NKUV MG[ XCNWG GCEJ HWPEVKQP TGCFARKEMU FR FKTGEVQT[ ] RKEMU ] 2úVNC FNC Y[PKMÎY %[PPQ è Vú Y[MQPWLG HWPMELC TGCFARKEMU Y I ÎYPGL VCDNKE[ INQDCN RKEMU YKPU 7UVCYKGPKG PC YCTVQ è FNC MC FGL VCDNKE[ KH HKNGAPCOG TGCFFKT FR ] NQUUGU 7UVCYKGPKG PC YCTVQ è 5RTCYFGPKG MC FGIQ RNKMW Y MCVCNQIW FNC MC FGL VCDNKE[ KH UWDUVT HKNGAPCOG YJKNG NKUV MG[ XCNWG GCEJ RKEMUA ] -QPV[PWCELC XCNWG ] 2úVNC FNC MC FGL Y RT[RCFMW QFPCNGKGPKC RNKMW VCDNKE[ W [VMQYPKMC V[RCOK XCNWG UWDUVT XCNWG RCTUGAHKNGAPCOG GZRNQFG UVTNGP XCNWG A HKNGAPCOG 7UWPKúEKG PCMW TGVWTP 2TGMUVC EGPKG PCY[ RNKMW PC QFRQYKGFPK HQTOCV KH XCNWG YKPPGTU= MG[? CPF MG[ ] ,G GNK V[R KH RCTUGAHKNGAPCOG=? W [VMQYPKMC LGUV Y C EKY[ 9''- CPF RCTUGAHKNGAPCOG=? RT[PCLGO[ OW RWPMV CNG PKG 9KPPGTU ] ,G GNK VQ NKE[O[ YKGTUC PT PKG LGUV RNKM FCP[OK YKPU Q Y[EKúECEJ C PWOGT V[IQFPKC _ GNUGKH MG[ ] LGUV Y C EKY[ NQUUGU 24
  19. 19. Zaawansowane programowanie w PHP Skrypt 1.3. ciąg dalszy Skrypt 1.3. ciąg dalszy _ _ GNUG ] 9[ YKGVNGPKG MQOWPKMCVW _ Q D úFKG LG GNK QVYCTEKG RNKMW PKG RQYKQF Q UKú TGUWNVU= MG[? CTTC[ YKPU YKPU NQUUGU NQUUGU GEJQ 0KG OQ PC QVYQT[è RNKMW CRKUCPKG Y[PKMÎY MC FGIQ V[IQFPKQY[OK Y[PKMCOK W [VMQYPKMÎY Y VCDNKE[ HKNGDT DT _ _ ! MUQTV TGUWNVU 7RQTæFMQYCPKG DQF[ VCDNKE[ CNHCDGV[EPKG JVON
  20. 20. CRKUCPKG V[IQFPKQY[EJ Y[PKMÎY
  21. 21. Struktura i dokumentowanie kodu HWPEVKQP YTKVGATGUWNVU XCNWG MG[ HR ] CRKUWLG Y[PKMK FQ RNKMW UVCVKE HKTUVANKPG KH HKTUVANKPG ] CRKUCPKG RKGTYUGIQ YKGTUCCVTCR[ CNG V[NMQ TC HRWVU HR )TCEVRQRTCYPG VD úFPGP QFCPKG PCMW TGVWTP VCM CD[ MC F[ CRKU PCNC UKú Y QUQDP[O YKGTUW HKTUVANKPG 647' _ FCVC KORNQFG V XCNWG HRWVU HR MG[V FCVCP QFCPKG PCMW TGVWTP VCM CD[ MC F[ CRKU PCNC UKú Y QUQDP[O YKGTUW _ HKNG TGUWNVUA 9''- AVZV 9UMCCPKG PCY[ RNKMW Y HQTOCEKG TGUWNVUAAVZV KH HR HQRGP HKNG Y ] 1VYCTEKG RNKMW FQ CRKUW CTTC[AYCNM TGUWNVU YTKVGATGUWNVU HR 9[U CPKG CYCTVQ EK EC GL VCDNKE[ FQ HWPMELK YTKVGATGUWNVU HENQUG HR COMPKúEKG RNKMW GEJQ 9[PKMK CRKUCPQDT DT 25
  22. 22. Rozdział 1. Poruszyliśmy ju sporo zagadnień, dotyczących dobrej struktury kodu oraz właściwego jego dokumentowania. Zwięzły dokument poświęcony temu tematowi — Standard kodowania w PHP (PHP Coding Standard) mo na znaleźć pod adresem www.DMCinsights.com/phpadv /coding_standard.php (rysunki 1.1 oraz 1.2). W dokumencie tym opisano formalne reguły zapisywania kodu w PHP wraz z ich uzasadnieniem. W tej ksią ce będę wskazywał miejsca, gdzie przestrzegam konwencji, i te, gdzie je łamię. Nale y jednak pamiętać o trzech sprawach. Po pierwsze, chciałbym podkreślić, e bez względu na to, czy będziemy przestrzegać standardu kodowania PHP, czy moich Struktura i dokumentowanie kodu przyzwyczajeń, najwa niejsze jest zachowanie Rysunek 1.1. „PHP Coding Standard” spójności. Niespójność nie tylko jest na bakier (Standard kodowania w PHP) jest przewodnikiem z ka dym standardem, ale prowadzi do błędów „gramatycznym” programowania w PHP i z pewnością spowoduje konieczność spędzenia dodatkowych godzin w czasie prób uruchamiania. Poza tym, je eli pracujemy w zespole, musimy opracować plan, którego powinni przestrzegać wszyscy członkowie zespołu. Je eli programujemy dla klienta, powinniśmy pozostawić przejrzystą, spójną dokumentację, tak aby klient lub inny programista mógł z łatwością zrozumieć naszą pracę. Po drugie, struktura kodu i jego dokumentowanie jest elementem, który powinniśmy stosować od momentu rozpoczęcia kodowania i kontynuować w czasie pracy. Próby tworzenia komentarzy po zapisaniu kodu nigdy nie będą Rysunek 1.2. „PHP Coding Standard” (Standard tak skuteczne, a często w ogóle nie będą podjęte. kodowania w PHP) doskonale opisuje reguły, To, co wydaje się oczywiste w trakcie tworzenia, uzasadnia je i demonstruje, w jaki sposób stanie się niejasne trzy miesiące później. Je eli przestrzegać tych zasad podczas tworzenia kodu jeszcze tego nie doświadczyliśmy, to z pewnością zdarzy się to nam pewnego dnia. Po trzecie, ze względu na ograniczenia formatu ksią kowego, skrypty opracowane w tej ksią ce od tego momentu nie będą tak dobrze uło one, ani udokumentowane, jak to być powinno. Istnieje przecie limit wykorzystania cennej przestrzeni ksią kowej na zapiski typu GXGNQRGF D[ .CTT[ ' 7NNOCP Osobiście zawsze stosuję się do trzech wymienionych ni ej konwencji (będę to robił tak e w tej ksią ce): 26
  23. 23. Zaawansowane programowanie w PHP u Nazwy zmiennych powinny być zapisywane małymi literami ze znakiem podkreślenia jako separatorem słów. Niektórzy zalecają, aby nazwy zmiennych globalnych zaczynały się na literę g, ale ja nie stosuję tej zasady. u Poniewa w języku XML skrócone wersje znaczników (! oraz ! ) są wykorzystywane, zatem je eli korzystamy z XML-a, powinniśmy stosować formalne znaczniki PHP (!RJR ! ). Przekonamy się o tym w rozdziale 9., „XML”. Zalecam, aby zawsze stosować znaczniki formalne, poniewa jest Rysunek 1.3. Program PHPDoc opracowano w celu zautomatyzowania procesu dokumentowania to najlepszy sposób zachowania zgodności kodu. Program wykorzystuje wyra enia regularne pomiędzy serwerami. do analizowania kodu i wstawiania opisów u Dla stron, które mają być interpretowane jako skrypty PHP, zaleca się wykorzystywanie Struktura i dokumentowanie kodu rozszerzenia .php (dla plików włączanych, jak np. klas i stron konfiguracyjnych, mo na wykorzystywać inne rozszerzenia). Dopuszczalne rozszerzenia plików są określone przez konfigurację serwera WWW, ale w społeczności PHP domyślnie przyjmuje się rozszerzenie .php (rozszerzenie stosowane w PHP w wersji 3. — .php3 będzie działać w większości serwerów z PHP4, ale wydaje się, e ze względu na istnienie nowych wersji, stosowanie tego rozszerzenia jest nieuzasadnione). Rysunek 1.4. Je eli programujemy z wykorzystaniem biblioteki PEAR, powinniśmy przestrzegać Wskazówki specyficznych zasad dokumentowania i tworzenia Program PHPDoc jest aplikacją typu struktury kodu (http://pear.php.net/manual/en/ standards.php). open source, wspomagającą pracę w PHP. Opracowano go na podstawie popularnego programu JavaDoc (słu ącego do dokumentowania programów w języku Java). Program ten jest przeznaczony do wspomagania procesu dokumentowania kodu. Więcej informacji na temat tego programu mo na znaleźć pod adresem www.PHPDoc.de (rysunek 1.3). Je eli zamierzamy stworzyć kod, który będzie wykorzystywany wraz z pakietem PEAR (zobacz rozdział 12., „Rozszerzanie PHP”), wówczas powinniśmy przestrzegać reguł formatowania obowiązujących dla tego pakietu (rysunek 1.4). 27
  24. 24. Rozdział 1. Zgodnie ze składnią funkcja CTTC[AYCNM Tablice pobiera tablicę jako pierwszy parametr oraz Tablice są specjalnego rodzaju zmiennymi, nazwę funkcji bez adnych nawiasów ani które mogą działać jak tabele w arkuszu argumentów jako drugi parametr. W czasie kalkulacyjnym. Ze względu na mo liwości, wykonywania iteracji funkcji CTTC[AYCNM jakie oferują, oraz elastyczność, tablice są funkcja będzie otrzymywać kolejne indeksy powszechnie wykorzystywane w zaawansowanym tablicy oraz wartości. Powy szy kod spowoduje programowaniu w PHP. W tym podrozdziale wygenerowanie następującego wyniku: opiszemy kilka najbardziej powszechnych 2CDNQ *QPG[ DT funkcji obsługi tablic. 6JG $GPFU DT 1- %QORWVGT DT Nowością w PHP4 jest konstrukcja HQTGCEJ, -KF # DT którą opracowano w celu umo liwienia #OPGUKCE DT łatwiejszego dostępu do wszystkich indeksów i wartości tablicy. Zakładając, e mamy tablicę Ze skryptów znajdujących się w dalszej części o nazwie CTTC[, mo emy uzyskać dostęp ksią ki dowiemy się, w jaki sposób przekazać do ka dego jej elementu za pomocą więcej argumentów funkcji wywoływanej następującego kodu: za pomocą CTTC[AYCNM . HQTGCEJ CTTC[ CU MG[ XCNWG ] Zwróćmy uwagę, e funkcja CTTC[AYCNM MQF działa jedynie z funkcjami definiowanymi _ przez u ytkownika i nie będzie działać Osobiście do obsługi tablic wykorzystuję z wbudowanymi funkcjami PHP. Nale y te konstrukcję HQTGCEJ i będę to robił tak e w tej pamiętać o konieczności wykonania funkcji TGUGV w PHP4, je eli chcemy skorzystać Tablice ksią ce. Je eli korzystamy z wcześniejszej wersji PHP, będziemy musieli przepisać z tablicy ponownie. powy szy kod na następującą postać: Dla zademonstrowania niektórych TGUGV CTTC[ zaawansowanych technik obsługi tablic YJKNG NKUV MG[ XCNWG GCEJ CTTC[ ] zapiszemy pierwszą część aplikacji obsługującej MQF totalizator sportowy. Jej przeznaczeniem _ jest obsługa profesjonalnego futbolu Podstawową ró nicą pomiędzy konstrukcją amerykańskiego, ale mo na ją z łatwością HQTGCEJ oraz YJKNG jest fakt, e pierwsza z tych przystosować do dowolnej innej dziedziny. pętli automatycznie ponownie ustawia tablicę Pierwsze dwa skrypty dynamicznie wygenerują na pozycję początkową, natomiast druga tego formularz, gdzie u ytkownicy będą mogli nie robi. wprowadzać swoje typy. Poniewa nie wszyscy mamy dostęp do bazy danych, aplikacja ta Inną funkcją obsługi tablic, którą często do zapisu informacji będzie wykorzystywać wykorzystuję, chocia nie jest to nowość wersji jednorodny plik tekstowy. PHP4, jest CTTC[AYCNM . Funkcja ta pozwala na podstawienie ka dego elementu tablicy do funkcji zdefiniowanej przez u ytkownika. HWPEVKQP RTKPVACNDWOU XCNWG MG[ ] GEJQ XCNWG DT P _ CTTC[CTTC[ 2CDNQ *QPG[ 6JG $GPFU 1- å%QORWVGT -KF # #OPGUKCE CTTC[AYCNM CTTC[ RTKPVACNDWOU 28
  25. 25. Zaawansowane programowanie w PHP Skrypt 1.4. Dane dla totalizatora będą zapisywane Aby skorzystać z tablic: w plikach tekstowych rozdzielanych tabulatorami jak plik przedstawiony ni ej: 1. Utworzymy plik tekstowy w edytorze tekstów. )Q EKG )QURQFCTG 0GY 1TNGCPU $WHHCNQ 2. Zapiszemy wiersz nagłówka (skrypt 1.4): 0GY 'PINCPF %KPEKPPCVK )QURQFCTG )Q EKG 5GCVVNG %NGXGNCPF 6CORC $C[ CNNCU W pliku tekstowym najpierw będzie GVTQKV )TGGP $C[ wymieniona dru yna gości, a następnie 1CMNCPF -CPUCU %KV[ %CTQNKPC /KPPGUQVC dru yna gospodarzy. Ka dy mecz będzie +PFKCPCRQNKU 0; ,GVU zajmował oddzielny wiersz. Wiersz 2KVVUDWTIJ ,CEMUQPXKNNG nagłówkowy słu y do wyznaczenia układu %JKECIQ $CNVKOQTG tablicy oraz działa jako obejście niektórych 5V .QWKU 2JKNCFGNRJKC specyficznych właściwości tablic. Kiedy ten 9CUJKPIVQP 5CP KGIQ #VNCPVC 5CP (TCPEKUEQ plik będzie wczytany do tablicy, rozpocznie /KCOK 6GPPGUUGG się ona — jak zwykle w przypadku tablic 0; )KCPVU GPXGT — od indeksu 0. Poniewa wolę, aby indeksy tablic były zgodne z numerami gier, a chciałbym numerować wiersze od 1. do 15. (lub 14., 16. itp.), dlatego opuszczam jeden wiersz. Tak więc pierwsza gra jest wymieniona w drugim wierszu, zatem będzie umieszczona pod indeksem 1. Tablice 3. Wpiszemy kolejne gry: 0GY 1TNGCPU $WHHCNQ 0GY 'PINCPF %KPEKPPCVK 5GCVVNG %NGXGNCPF 6CORC $C[ CNNCU GVTQKV )TGGP $C[ 1CMNCPF -CPUCU %KV[ %CTQNKPC /KPPGUQVC +PFKCPCRQNKU 0; ,GVU 2KVVUDWTIJ ,CEMUQPXKNNG %JKECIQ $CNVKOQTG 5V .QWKU 2JKNCFGNRJKC 9CUJKPIVQP 5CP KGIQ #VNCPVC 5CP (TCPEKUEQ /KCOK 6GPPGUUGG 0; )KCPVU GPXGT Gry są wyszczególnione w formacie Dru yna gości [TAB] Dru yna gospodarzy [RETURN] (bez spacji). Znaku tabulacji u yjemy w celu rozró nienia dwóch elementów ka dego wiersza. 4. Zapiszemy plik jako week1.txt. 29
  26. 26. Rozdział 1. 5. Podobne pliki stworzymy dla pozostałych tygodni w sezonie, nazywając je na przykład week2.txt, a do week17.txt. Je eli śledzimy ten przykład bez zmian, mo emy pobrać wszystkie te pliki z witryny pod adresem www.DMCinsights.com/phpadv. W plikach tych nie nale y wprowadzać adnych komentarzy, poniewa kolidowałoby to ze sposobem ich wykorzystania (i tak będą odczytywane tylko przez PHP). 6. Stworzymy katalog 2001 na naszym serwerze WWW. Mo emy u yć dowolnej innej nazwy, która będzie określała sezon jako całość. 7. Uprawnienia do katalogu ustawimy jako 777 (odczyt, zapis, wyszukiwanie dla wszystkich). Ze względów bezpieczeństwa, je eli to mo liwe, powinniśmy umieścić ten katalog poni ej katalogu głównego serwera. Je eli ju to zrobimy, powinniśmy upewnić się, e stosujemy właściwe odwołania do tego katalogu we wszystkich przedstawionych poni ej skryptach (tzn. Tablice u ywając odwołania../2001 zamiast 2001/). 8. Umieścimy wszystkie pliki dla poszczególnych tygodni w katalogu 2001. Teraz, kiedy utworzyliśmy dane zawierające informacje o wszystkich grach sezonu, czas zapisać skrypt, który przekształci te dane na format HTML. 9. W edytorze tekstowym stworzymy nowy dokument HTML (skrypt 1.5): 1%6;2' JVON 27$.+% 9%6 :*6/. å6TCPUKVKQPCN2. JVVRYYYYQTI644'%ZJVON å6ZJVONVTCPUKVKQPCNFVF JVON ZONPU JVVRYYYYQTIZJVON JGCF VKVNG 6QVCNKCVQT RK MCTUMKVKVNG JGCF 30
  27. 27. Zaawansowane programowanie w PHP Skrypt 1.5. Ten skrypt dynamicznie generuje formularz na podstawie pliku w formacie zwykłego tekstu 1%6;2' JVON 27$.+% 9%6 :*6/. 6TCPUKVKQPCN2. JVVRYYYYQTI644'%ZJVON6ZJVONVTCPUKVKQPCNFVF JVON ZONPU JVVRYYYYQTIZJVON JGCF VKVNG 6QVCNKCVQT RK MCTUMKVKVNG JGCF DQF[ !RJR OCMGARKEMUAHQTORJR YGGM HKNG YGGM YGGM VZV 9UMCCPKG RNKMW PC RQFUVCYKG PWOGTW V[IQFPKC KH ICOGU HKNG HKNG ] 9E[VCPKG RNKMW FQ VCDNKE[ 2Q RTGE[VCPKW RNKMW Y[ YKGVNGPKG HQTOWNCTC GEJQ HQTO CEVKQP UVQTGARKEMURJR OGVJQF RQUV VCDNG DQTFGT YKFVJ EGNNURCEKPI EGNNRCFFKPI CNKIP EGPVGT VT CNKIP EGPVGT XCNKIP VQR VF EQNURCP YKFVJ CNKIP EGPVGT XCNKIP VQR PQYTCR PQYTCR 9RTQYCF PCYú W [VMQYPKMC KPRWV V[RG VGZV PCOG WUGTPCOG UKG OCZNGPIVJ VF VT HQTGCEJ ICOGU CU MG[ CTTC[ ] CUVQUQYCPKG VCDNKE[ FQ Y[ YKGVNGPKC MC FGL IT[ KH MG[ ] 9KGTUC )Q EKG )QURQFCTG PKG Y[ YKGVNCO[ Tablice UGEQPFACTTC[ GZRNQFG V CTTC[ 2TGMUVC EGPKG MC FGIQ YKGTUC VCDNKE[ Y QFFKGNPæ VCDNKEú CYC[ UGEQPFACTTC[=? 2KGTYU[ GNGOGPV QFRQYKCFC GURQ QYK IQ EK JQOG UWDUVT UGEQPFACTTC[=? UVTNGP UGEQPFACTTC[=? TWIK GNGOGPV QFRQYKCFC GURQ QYK IQURQFCT[ CNG OWUKO[ WUWPæè PCM TGVWTP GEJQ VT CNKIP EGPVGT XCNKIP VQR VF CNKIP NGHV XCNKIP VQR PQYTCR PQYTCR KPRWV V[RG TCFKQ PCOG RKEMU= MG[? XCNWG CYC[ CYC[VF VF CNKIP EGPVGT XCNKIP VQR RTGEKYVF VF CNKIP TKIJV XCNKIP VQR PQYTCR PQYTCR KPRWV V[RG TCFKQ PCOG RKEMU= MG[? XCNWG JQOG JQOGVF VT P _ _ 7WRG PKGPKG HQTOWNCTC K VCDGNK GEJQ VT CNKIP EGPVGT XCNKIP VQR VF EQNURCP YKFVJ CNKIP EGPVGT XCNKIP VQR KPRWV V[RG UWDOKV PCOG UWDOKV XCNWG 9[ NKL VT VCDNG KPRWV V[RG JKFFGP PCOG YGGM XCNWG YGGM HQTO P _ GNUG ] 9[ YKGVNGPKG MQOWPKMCVW Q D úFKG LG GNK QVYCTEKG RNKMW PKG RQYKQF Q UKú GEJQ 0KG OQ PC QVYQT[è RNKMW HKNG 0CNG [ WRGYPKè UKú E[ OKGPPC YGGM OC WUVCYKQPæ YCTVQ èDT DT _ ! DQF[ JVON 31
  28. 28. Rozdział 1. Instrukcje echo, print oraz cudzysłowy W PHP istnieje kilka sposobów przesyłania tekstu do przeglądarki. Najbardziej popularne sposoby polegają na wykorzystaniu instrukcji RTKPV oraz GEJQ. Istnieją tylko pewne subtelne ró nice w sposobie działania tych dwóch instrukcji. W jakich sytuacjach nale y stosować którą, jest raczej kwestią indywidualnego wyboru ni czegokolwiek innego. Jedna z ró nic polega na tym, e instrukcja echo jest minimalnie, prawie niezauwa alnie szybsza ni instrukcja print. Wynika to stąd, e po pomyślnym wykonaniu instrukcja print zwraca wartość (1 oznacza, e instrukcja zakończyła się pomyślnie), natomiast instrukcja echo tego nie robi. Właściwością funkcji echo, której nie znajdziemy w funkcji print, jest mo liwość łatwego umieszczania zmiennych w kodzie HTML. Zazwyczaj (w naszych skryptach) fragment formularza zapisanego w formacie HTML ma następującą postać: KPRWV V[RG VGZV PCOG WUGTPCOG XCNWG !RJR GEJQ WUGTPCOG ! W takim przypadku mo emy zastosować dwa skróty. Po pierwsze, zawsze mo emy pominąć ostatni średnik w skrypcie PHP, chocia korzystanie z tego nie jest dobrą praktyką. Poza tym, stosując instrukcję echo, mo emy skrócić kod, wpisując znak równości po początkowym znaczniku PHP (ale tylko w przypadku wykorzystywania krótkiej postaci znacznika). Tak więc zapis: !RJR GEJQ WUGTPCOG ! przyjmie postać: ! WUGTPCOG ! Tablice Wa niejsze od tego, z której funkcji skorzystamy (technicznie to nie są funkcje, a konstrukcje języka), jest odpowiedź na pytanie, czy skorzystamy z apostrofów, czy te z cudzysłowów. W obu instrukcjach echo oraz print mo na korzystać zarówno z apostrofów, jak te z cudzysłowów. Ró nica polega na sposobie interpretowania zmiennych oraz na tym, e niektóre znaki nale y poprzedzić znakiem odwrotnego ukośnika. U ycie apostrofu spowoduje wyświetlenie zawartości w postaci takiej, jak jest i wymaga poprzedzenia znakiem odwrotnego ukośnika jedynie samego znaku apostrofu. Tak więc instrukcja: GEJQ C JTGH KPFGZRJR *QOGC zadziała bez problemu. Odpowiednik tej instrukcji z zastosowaniem cudzysłowów przyjąłby następującą postać: GEJQ C JTGH KPFGZRJR *QOGC Aby w źródle HTML znalazł się znak cudzysłowu (co jest konieczne dla zachowania poprawności składni), nale y go poprzedzić znakiem odwrotnego ukośnika. Z tego względu wysyłając kod HTML do przeglądarki, stosuję instrukcję echo z apostrofem. Jednym z problemów podczas wykorzystywania apostrofów jest sposób interpretacji zmiennych i sekwencji specjalnych, które w tym przypadku są traktowane dosłownie, co oznacza, e instrukcje postaci: OKGPPC YCTVQUE GEJQ OKGPPC P spowodują wyświetlenie ciągu $zmienna n, a nie wartości zmiennej, po której następuje znak końca wiersza, co nastąpi w wyniku zastosowania poni szego kodu: OKGPPC YCTVQUE GEJQ OKGPPC P 32
  29. 29. Zaawansowane programowanie w PHP Instrukcje echo, print oraz cudzysłowy (ciąg dalszy) Ten sam problem występuje w czasie przypisywania wartości do zmiennej lub przy odwołaniach do indeksów tablic. OKGPPC YCTVQUE GEJQ VCDNKEC= OKGPPC ? 1FPQUK UKú FQ GNGOGPVW RQF KPFGMUGO OKGPPC GEJQ VCDNKEC= OKGPPC ? 1FPQUK UKú FQ GNGOGPVW RQF KPFGMUGO YCTVQUE Biorąc pod uwagę sposób wyświetlania zmiennych, powinienem tak e wyjaśnić sposób interpretowania w PHP tablic wielowymiarowych. Zazwyczaj element tablicy wielowymiarowej (tablicy zło onej z tablic) mo emy zlokalizować, stosując konstrukcję: PCYCAVCDNKE[= PCYCAVCDNAYGYP ?= KPFGMUAVCDNAYGYP ? Ale próba wyświetlenia tego elementu za pomocą instrukcji GEJQ 9CTVQ è Y[PQUK PCYCAVCDNKE[= PCYCAVCDNAYGYP ?= KPFGMUAVCDNAYGYP ? nie zadziała. W takim przypadku mamy dwie mo liwości. Po pierwsze, mo emy u yć operatora konkatenacji, aby opuścić cudzysłów. Niestety, w niektórych systemach (np. Mac OS X) taka konstrukcja nie zadziała: GEJQ 9CTVQ è Y[PQUK PCYCAVCDNKE[= PCYCAVCDNAYGYP ?= KPFGMUAVCDNAYGYP ? Mo emy te wykorzystać nawiasy klamrowe wewnątrz cudzysłowów: GEJQ 9CTVQ è Y[PQUK ] PCYCAVCDNKE[= PCYCAVCDNAYGYP ?= KPFGMUAVCDNAYGYP ?_ Dotyczy to zarówno instrukcji GEJQ, jak te instrukcji RTKPV. Tablice Doskonały przewodnik dotyczący ciągów znaków, cudzysłowów, apostrofów itp. zagadnień mo na znaleźć pod adresem www.zend.com/zend/tut/using-strings.php. 33
  30. 30. Rozdział 1. 10. Rozpoczniemy wpisywanie treści dokumentu HTML oraz umieścimy inicjujący znacznik PHP: DQF[ !RJR 11. Wskazujemy plik, który będzie Rysunek 1.5. Poniewa nie wprowadziliśmy wykorzystywany: wartości zmiennej $week (zobacz wiersz adresu), HKNG YGGM YGGM VZV to skrypt nie mógł odczytać pliku. Na rysunku 1.6 pokazano uzyskany wynik, kiedy zastosowano Zakłada się, e do skryptu zostanie znak @ w celu wyłączenia komunikatu o błędzie przekazana zmienna YGGM o wartości od 1 generowanego przez PHP do 17 (w moim przypadku). Tak więc wygenerowanie formularza dla ka dego tygodnia wymaga jedynie przekazania do tego skryptu numeru tego tygodnia. 12. Utworzymy instrukcję warunkową, w której podejmiemy próbę odczytania określonego pliku do tablicy: KH ICOGUHKNG HKNG ] Rysunek 1.6. Zastosowanie znaku @ umo liwia wyłączenie wyświetlania mylących i brzydkich Je eli skrypt prawidłowo odczyta plik, technicznych komunikatów o błędach wówczas zostanie utworzona tablica ICOGU, Tablice zawierająca informacje o wszystkich grach danego tygodnia. Dzięki zastosowaniu znaku spowodujemy, e nie będą wyświetlane komunikaty o błędach w przypadku, gdy odczytanie pliku nie powiedzie się (porównajmy rysunek 1.5, gdzie nie zastosowano znaku , z rysunkiem 1.6, gdzie zastosowano ten znak). 13. Rozpoczniemy formularz HTML. GEJQ HQTO CEVKQP UVQTGARKEMURJR OGVJQF å RQUV VCDNG DQTFGT YKFVJ EGNNURCEKPI å EGNNRCFFKPI CNKIP EGPVGT VT CNKIP EGPVGT XCNKIP VQR VF EQNURCP YKFVJ CNKIP EGPVGT åXCNKIP VQR PQYTCR PQYTCR 9RTQYCF åPCYú W [VMQYPKMC KPRWV V[RG VGZV PCOG WUGTPCOG åUKG OCZNGPIVJ VF VT 34
  31. 31. Zaawansowane programowanie w PHP Formularz HTML jest dosyć prosty, Pierwszy wiersz w tym kodzie stanowi nowa słu y do wprowadzania jedynie nazwy konstrukcja HQTGCEJ, której u ycie stanowi u ytkownika oraz typu dla ka dej gry. łatwą i w pewnym sensie szybszą metodę Później mo na opracować system obsługi tablic. uwierzytelniania, który będzie działać, Drugi wiersz zapewnia, e obsługiwany zanim u ytkownik wykona ten krok element nie jest pierwszym elementem (system ten mógłby następnie w pliku. Jak wynika z przykładu pokazanego automatycznie wprowadzać lub wy ej (skrypt 1.4), elementem tablicy pod zapisywać nazwy u ytkowników). indeksem jest wiersz o wartości )Q EKG Uwaga: Zakończenie instrukcji echo =6#$? )QURQFCTG, którego nie będziemy kończącym znakiem apostrofu w osobnym wyświetlać. wierszu mo e wydawać się dziwne, ale Je eli nie jest to pierwszy element tablicy, w rezultacie kod HTML staje się bardziej wówczas zostanie on podzielony za pomocą czytelny. Dzięki niemu mamy pewność, funkcji GZRNQFG na poszczególne części e następna instrukcja HTML rozpocznie się (dru ynę gości oraz dru ynę gospodarzy). w osobnym wierszu, a nie od kończącego Ka da dru yna jest formalnie VT przyporządkowana osobnej zmiennej (za 14. Utworzymy pętlę, przeglądającą tablicę, ka dym razem obcinany jest znak RETURN wpisując ka dą grę do formularza: z nazwy dru yny gospodarzy). HQTGCEJ ICOGU CU MG[ CTTC[ ] Ostatecznie wyświetlany jest wiersz tabeli KH MG[ ] zło ony z uzyskanych informacji. UGEQPFACTTC[ GZRNQFG V CTTC[ Tablice CYC[ UGEQPFACTTC[=? 15. Uzupełnimy kod formularza HTML JQOG UWDUVT UGEQPFACTTC[=? oraz tabeli. å UVTNGP UGEQPFACTTC[=? GEJQ VT CNKIP EGPVGT GEJQ VT CNKIP EGPVGT XCNKIP VQR åXCNKIP VQR VF EQNURCP YKFVJ VF CNKIP NGHV XCNKIP VQR åCNKIP EGPVGT XCNKIP VQR KPRWV åPQYTCR PQYTCR KPRWV V[RG TCFKQ åV[RG UWDOKV PCOG UWDOKV åPCOG RKEMU= MG[? åXCNWG 9[ NKL åXCNWG CYC[ CYC[VF VT VF CNKIP EGPVGT VCDNG åXCNKIP VQR RTGEKYVF KPRWV V[RG JKFFGP PCOG YGGM VF CNKIP TKIJV XCNKIP VQR åXCNWG YGGM åPQYTCR PQYTCR KPRWV V[RG TCFKQ HQTO P åPCOG RKEMU= MG[? åXCNWG JQOG JQOGVF Nale y pamiętać, aby zastosować typ *+'0 w celu przechowania numeru tygodnia, aby VT P był on dostępny w skrypcie store_picks.php, _ który obsługuje formularz. _ 35
  32. 32. Rozdział 1. 16. Zakończymy główną instrukcję warunkową i zamkniemy znaczniki PHP i HTML. _ GNUG ] GEJQ 0KG OQ PC QVYQT[è RNKMW HKNG å0CNG [ WRGYPKè UKú E[ OKGPPC YGGM OC åWUVCYKQPæ →YCTVQ èDT DT _ ! DQF[ JVON Komunikat o błędzie, wygenerowany przez powy szy kod, jest przeznaczony bardziej dla programisty ni dla u ytkownika (prawdopodobnie nie będziemy chcieli wyświetlać nazwy pliku w komunikacie Rysunek 1.7. Oto formularz utworzony przez o błędzie, który mo e być przeglądany skrypt make_picks_form, umo liwiający przez wszystkich). Komunikat ten mo na wytypowanie zwycięzcy we wszystkich 15 grach przetworzyć na bardziej przyjazny dla u ytkownika w zale ności od sposobu działania naszej aplikacji. 17. Zapisujemy plik jako make_picks_form.php i kopiujemy ten plik na nasz serwer, do tego samego katalogu, gdzie utworzyliśmy Tablice katalog 2001. Ładujemy go w przeglądarce WWW, dodając do adresu URL ciąg !YGGM, aby skrypt mógł działać poprawnie (rysunki 1.7 oraz 1.8). Na razie nie korzystamy z przycisku Wyślij. Wskazówki W rozdziale 5., „Projektowanie aplikacji Rysunek 1.8. Rozwa ne wykorzystywanie instrukcji echo oraz spacji w skryptach PHP WWW”, zostanie omówione bardziej powoduje, e kod źródłowy HTML staje się szczegółowo u ycie symbolu . bardziej czytelny W rozdziale 4., „Bezpieczeństwo”, opracujemy system rejestracji u ytkowników oraz uwierzytelniania, którego będziemy mogli u ywać wraz z tymi skryptami oraz z dowolnymi innymi. 36
  33. 33. Zaawansowane programowanie w PHP Stałe Stałe to specjalny rodzaj zmiennych, któremu — moim skromnym zdaniem — nie poświęca się dostatecznie du o uwagi. Stałe, jak wskazuje nazwa, zawierają wartość, która nie zmienia się, ani te nie mo e się zmieniać w czasie działania skryptu. Ponadto dodatkową zaletą stałych jest fakt, e w danym zakresie są one globalne, co oznacza, e są automatycznie dostępne wewnątrz funkcji. W nazwach stałych wielkość liter ma znaczenie, podobnie jak w nazwach wszystkich zmiennych w PHP. Zasadą jest zapisywanie nazw stałych tylko wielkimi literami. W czasie nadawania nazw zmiennym nale y stosować te same zasady, jak w przypadku zmiennych — litera (z wyjątkiem początkowego znaku dolara) lub znak podkreślenia, po którym następują litery, cyfry lub znaki podkreślenia. Stałą tworzy się za pomocą funkcji FGHKPG w następujący sposób: FGHKPG 0#9#A56# ', YCTVQ è Stałe Stałą mo na zdefiniować tylko jako liczbę (całkowitą lub zmiennoprzecinkową), albo jako ciąg znaków. Nie mo na zdefiniować stałej jako tablicy lub jako obiektu, a po utworzeniu stałej jej wartości nie mo na aktualizować, tak więc nie mo na przekształcić stałej łańcuchowej na liczbę całkowitą. Stałą mo na uwa ać za niezmienną zmienną. W PHP istnieje wiele wbudowanych stałych, włącznie z 2*2A15 (system operacyjny), 2*2A8'45+10 (np. 4.0.3pl1), 647' oraz (#.5'. Dwie zmienne wbudowane — AA(+.'AA oraz AA.+0'AA oznaczające bie ącą nazwę pliku oraz numer wiersza — zmieniają się w czasie działania skryptu. Stałe te przydają się do uruchamiania diagnostycznego, o czym przekonamy się w rozdziale 5., „Projektowanie aplikacji WWW”. Lubię wykorzystywać stałe tam, gdzie występują zmienne, które nie powinny się zmieniać, lub w przypadku, je eli zmienna ma być dostępna w całym skrypcie. Jako demonstrację zdefiniowania i wykorzystania stałych zapiszemy skrypt store_ picks.php dla naszego totalizatora online. Skrypt ten będzie obsługiwał dane pochodzące ze strony make_picks_form.php utworzonej poprzednio. 37
  34. 34. Rozdział 1. Aby wykorzystać stałe: Skrypt 1.6. Skrypt store_picks.php definiuje zmienną YGGM jako stałą, aby zapewnić niezmienność jej 1. W edytorze tekstowym utworzymy nowy wartości w czasie działania skryptu dokument HTML (skrypt 1.6). 1%6;2' JVON 27$.+% 9%6 :*6/. 1%6;2' JVON 27$.+% 9%6 :*6/. 6TCPUKVKQPCN'0 å 6TCPUKVKQPCN2. JVVRYYYYQTI644'%ZJVON JVVRYYYYQTI644'%ZJVON 6ZJVONVTCPUKVKQPCNFVF å6ZJVONVTCPUKVKQPCNFVF JVON ZONPU JVVRYYYYQTIZJVON JVON ZONPU JVVRYYYYQTIZJVON JGCF JGCF VKVNG 6QVCNKCVQT RK MCTUMKVKVNG VKVNG 6QVCNKCVQT RK MCTUMKVKVNG JGCF JGCF DQF[ 2. Rozpoczniemy wpisywanie treści dokumentu !RJR 6GP UMT[RV QDU WIWLG FCPG G UMT[RVW HTML oraz umieścimy inicjujący znacznik OCMGARKEMUAHQTORJR PHP: DQF[ 7UVCYKGPKG PWOGTW V[IQFPKC LCMQ UVC GL ! RJR FGHKPG 9''- YGGM 3. Zdefiniujemy stałą 9''- (WPMELC YTKVGAFCVC CRKUWLG V[R[ Y RNKMW FGHKPG 9''- YGGM HWPEVKQP YTKVGAFCVC XCNWG MG[ HR ] HRWVU HR XCNWGP QFCPKG Poniewa na ka dej ze stron wykorzystywana PCMW TGVWTP CD[ WOKG EKè MC F[ jest wartość zmiennej YGGM, chcemy GNGOGPV Y QFFKGNP[O YKGTUW zapewnić, eby zmienna ta nie zmieniała _ Stałe wartości w czasie działania skryptu. Z tego powodu zmienną tę przekształcimy na stałą. HKNG RKEMUA 9''- A WUGTPCOG AVZV 9UMCCPKG RNKMW 4. Utworzymy funkcję, zapisującą typy Y HQTOCEKG RKEMUAA.CTT[AVZV u ytkowników. KH HR HQRGP HKNG Y ] HWPEVKQP YTKVGAFCVC XCNWG MG[ HR ] 1VYCTEKG RNKMW FQ CRKUW HRWVU HR XCNWGP _ HRWVU HR 9KGTU CVTCRCP 7VYQTGPKG YKGTUC CVTCR[ Funkcja YTKVGAFCVC będzie wykorzystywana CTTC[AYCNM RKEMU YTKVGAFCVC w połączeniu z funkcją CTTC[AYCNM zgodnie HR 9[U CPKG EC GL VCDNKE[ z tym, co napisano we wcześniejszej części FQ HWPMELK YTKVGAFCVC tego rozdziału. Funkcja YTKVGAFCVC HENQUG HR COMPKúEKG RNKMW otrzymuje element tablicy, jej indeks oraz GEJQ 6YQLG V[R[ QUVC [ CRKUCPG wskaźnik do pliku. Zawartość zapisaną _ GNUG ] 9[ YKGVNGPKG MQOWPKMCVW do pliku będzie stanowić nazwa zespołu Q D úFKG LG GNK QVYCTEKG RNKMW PKG wybrana przez u ytkownika zakończona RQYKQF Q UKú znakiem RETURN. W celu wygenerowania GEJQ 0KG OQ PC QVYQT[è RNKMW znaku RETURN nale y wykorzystać HKNG 0CNG [ WRGYPKè UKú E[ sekwencję P, poniewa alternatywna OKGPPC YGGM OC WUVCYKQPæ YCTVQ è DT DT sekwencja T powoduje problemy _ z odczytem pliku w niektórych systemach ! (pierwsza sekwencja generuje znak DQF[ RETURN, natomiast druga — znak CR). JVON 38
  35. 35. Zaawansowane programowanie w PHP 5. Wskazujemy plik, który będzie wykorzystywany HKNG RKEMUA 9''- A å WUGTPCOG AVZV Nazwa pliku składa się z przedrostka RKEMUA, po którym następuje numer tygodnia, znak podkreślenia, nazwa u ytkownika i ponownie znak podkreślenia. Plik ma rozszerzenie .txt. Nazwy stałej nie mo na umieścić w apostrofach ani w cudzysłowach, poniewa w takim przypadku PHP interpretowałby ją dosłownie jako 9''-, a nie jako wartość, którą stała reprezentuje. Je eli katalog 2001 umieścimy poza głównym katalogiem dokumentów WWW, wówczas w celu właściwego odwołania się do tego katalogu powinniśmy zastosować odpowiednią składnię. 6. Próbujemy otworzyć plik do zapisu. KH HR HQRGP HKNG Y ] Je eli ta instrukcja warunkowa przyjmie wartość HCNUG, wówczas nale y sprawdzić, Stałe czy poprawnie ustawiliśmy uprawnienia do katalogu 2001 — nieprawidłowe ich ustawienie jest najbardziej prawdopodobną przyczyną błędu, poniewa sam plik do tej pory nie istniał, zatem powinna istnieć mo liwość zapisu do tego pliku. Inną prawdopodobną przyczyną mo e być u ycie złego parametru, na przykład C zamiast Y. 7. Zapisujemy dane do pliku. HRWVU HR 9KGTU CVTCRCP CTTC[AYCNM RKEMU YTKVGAFCVC HR Pierwszym wierszem, który zapisujemy do pliku, jest wiersz — atrapa, a po nim, wykorzystując połączenie funkcji CTTC[A YCNM ze zdefiniowaną uprzednio funkcją YTKVGAFCVC , zapisujemy pozostałe dane. Teoretycznie moglibyśmy zdefiniować dodatkową funkcję, która przed zapisem danych sprawdzałaby, czy wytypowano wszystkich zwycięzców. 39
  36. 36. Rozdział 1. 8. Zamykamy plik, a po pomyślnym jego zamknięciu wysyłamy komunikat. HENQUG HR COMPKúEKG RNKMW GEJQ 6YQLG V[R[ QUVC [ CRKUCPG 9. Kończymy instrukcję warunkową, PHP oraz HTML. _ GNUG ] GEJQ 0KG OQ PC QVYQT[è RNKMW HKNG å0CNG [ WRGYPKè UKú E[ OKGPPC YGGM åOC WUVCYKQPæ YCTVQ èDT DT _ ! Rysunek 1.9. Je eli skrypt działa prawidłowo, DQF[ JVON wówczas u ytkownik uzyska ten lakoniczny komunikat 10. Zapisujemy plik jako store_picks.php i kopiujemy go na serwer, do tego samego katalogu, gdzie zapisaliśmy skrypt make_ picks_form.php (skrypt 1.5). Uruchamiamy ten drugi skrypt w przeglądarce WWW (rysunek 1.7) tak, aby skrypt store_picks.php został wykonany (rysunek 1.9). 11. Sprawdzamy w katalogu 2001, czy utworzono nowy plik (rysunek 1.10). Mo emy pobrać Stałe nowo utworzony plik i sprawdzić jego zawartość (skrypt 1.7). Rysunek 1.10. Katalog 2001, który jest bazą danych plików tekstowych, zawiera wszystkie dane, włącznie z nowo utworzonym plikiem picks_1_NAZWA_txt 40
  37. 37. Zaawansowane programowanie w PHP Skrypt 1.7. Po wykonaniu skryptu make_picks_ Wskazówki form.php oraz store_picks.php zostanie utworzony poni szy plik, zawierający moje typy dla gier Aby sprawdzić, czy zdefiniowano stałą w pierwszym tygodniu przed jej u yciem, mo na skorzystać z funkcji FGHKPGF : 9KGTU CVTCRC KH FGHKPGF 0#9#A56#.', ] $WHHCNQ 0GY 'PINCPF Nale y uwa ać, aby nie pomylić funkcji 5GCVVNG FGHKPGF z funkcją FGHKPG , która słu y 6CORC $C[ do ustawiania wartości stałej. )TGGP $C[ -CPUCU %KV[ Aby obejrzeć listę wszystkich zdefiniowanych /KPPGUQVC stałych, nale y skorzystać z funkcji +PFKCPCRQNKU IGVAFGHKPGFAEQPUVCPVU . 2KVVUDWTIJ %JKECIQ Chocia posiadanie katalogu z prawem 2JKNCFGNRJKC zapisu w obrębie katalogu WWW 5CP KGIQ (uprawnienia ustawione na 777), tak jak 5CP (TCPEKUEQ /KCOK w powy szym przykładzie katalog 2001, GPXGT nie jest bezpieczne, to czasami jest to konieczność. Istnieją obejścia oraz elementy, na które nale y zwracać uwagę w takich przypadkach. Zostaną one omówione w rozdziale 4., „Bezpieczeństwo”. Je eli istnieje mo liwość umieszczenia katalogu Stałe z prawem zapisu poza katalogiem WWW, tak będzie lepiej, chocia niektóre firmy świadczące usługi hostingu nie dadzą nam takiego wyboru. 41

×