Po prostu PHP. Techniki zaawansowane
Upcoming SlideShare
Loading in...5
×
 

Po prostu PHP. Techniki zaawansowane

on

  • 843 views

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 ...

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.

Statistics

Views

Total Views
843
Views on SlideShare
843
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Po prostu PHP. Techniki zaawansowane Po prostu PHP. Techniki zaawansowane Document Transcript

  • 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
  • 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
  • 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
  • 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
  • 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
  • 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. &6&ZJVONVTCPUKVKQPCNFVF 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 CVTCRC>P  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 X>P  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
  • 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 [VMQYPKM>VYU>VNU>P  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 M>V F>P  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
  • 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'%ZJVON&6&ZJVON  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 XCNWG>P    _  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
  • 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   
  •  HWPEVKQP YTKVGATGUWNVU XCNWG MG[   5KGEKQY[ U[UVGO VQVCNKCVQTC HR ] RK MCTUMKGIQ    UVCVKE HKTUVANKPG   1RTCEQYC  .CTT[ ' 7NNOCP    KH HKTUVANKPG ]   <CRKUCPQ  5KGTRKG   HRWVU HR 7 [VMQYPKM>V6[R[   2QRTCYKQPQ  UKGTRPKC  RQRTCYPG>V6[R[ D úFPG>P    HKTUVANKPG  647'   -QPVCEV RJR"&/%KPUKIJVUEQO  _     5VTQPC RTQEGUUAYKPPGTURJR QDU WIWLG  FCVC  KORNQFG >V  XCNWG  UVTQPú RKEMAYKPPGTURJR RCIG  HRWVU HR MG[>V FCVC>P  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   
  •   !  KH HR  "HQRGP HKNG Y ]   &1%6;2' JVON 27$.+% 9%&6& :*6/.   6TCPUKVKQPCN2.  CTTC[AYCNM TGUWNVU  JVVRYYYYQTI644'%ZJVON YTKVGATGUWNVU  HR   &6&ZJVONVTCPUKVKQPCNFVF  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[  
  • 
  •   JVON  
  • <CRKU Y[EKúEÎY Y RNKMW
  •   
  • 
  •    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 CVTCRC>P   HKTUVANKPG  647'  _  23
  • Rozdział 1. Skrypt 1.3. ciąg dalszy Skrypt 1.3. ciąg dalszy  HRWVU HR XCNWG>P   &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   _      
  • 
  •   
  • 
  •   
  • 1DNKEGPKG V[IQFPKQY[EJ Y[PKMÎY
  •   
  • 2QDTCPKG V[RÎY ITCE[
  •   
  • 
  •   
  • 
  •     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
  • 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    
  • 
  •   
  • <CRKUCPKG V[IQFPKQY[EJ Y[PKMÎY
  •   
  • 
  •   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 )TCE>VRQRTCYPG> VD úFPG>P   &QFCPKG PCMW TGVWTP VCM CD[ MC F[ CRKU PCNC UKú Y QUQDP[O YKGTUW  HKTUVANKPG  647'  _   FCVC  KORNQFG >V  XCNWG   HRWVU HR MG[>V FCVC>P   &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
  • 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
  • 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
  • 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
  • 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
  • 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 å&6&ZJVONVTCPUKVKQPCNFVF JVON ZONPU JVVRYYYYQTIZJVON JGCF VKVNG 6QVCNKCVQT RK MCTUMKVKVNG JGCF 30
  • 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'%ZJVON&6&ZJVONVTCPUKVKQPCNFVF  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
  • 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
  • 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
  • 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 ICOGU"HKNG 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
  • 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
  • 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
  • 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
  • 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 &6&ZJVONVTCPUKVKQPCNFVF å&6&ZJVONVTCPUKVKQPCNFVF  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 XCNWG>P   &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 XCNWG>P   _  HRWVU HR 9KGTU  CVTCRC>P   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
  • 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  CVTCRC>P  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
  • 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
  • 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
  • Rozdział 1. Funkcja ta będzie wywoływać samą siebie Funkcje rekurencyjne dopóty, dopóki zmienna P nie osiągnie i zmienne statyczne wartości większej ni 100. W tym momencie działanie funkcji zakończy się. Programując, z pewnością będziemy mieli okazję zdefiniowania i zastosowania własnej Wykorzystując rekurencję lub dowolny funkcji — jest to doskonałe narzędzie, które skrypt, gdzie ta sama funkcja wykonuje się pomaga właściwie zorganizować nasz kod oraz wiele razy, warto rozwa yć zastosowanie zaoszczędzić czas. Elementem, z którego być instrukcji UVCVKE. U ycie tej instrukcji mo e jeszcze nie korzystaliśmy, jest rekurencja powoduje, e wartości zmienne są pamiętane wewnątrz funkcji. pomiędzy poszczególnymi wywołaniami funkcji bez konieczności u ycia zmiennych Rekurencja to właściwość wywoływania funkcji globalnych. Funkcję EQWPVAVQA , w obrębie jej samej. dla zapewnienia identycznego wyniku jej HWPEVKQP PCYCAHWPMELK ] działania, mo na przepisać następująco: Funkcje rekurencyjne i zmienne statyczne  LCMK MQF HWPEVKQP EQWPVAVQA ] PCYCAHWPMELK  UVCVKE P _ KH P ] W wyniku zastosowania rekurencji uzyskamy GEJQ P DT DT  efekt, gdzie będziemy mogli wykorzystać P  EQWPVAVQA  funkcję zarówno zgodnie z jej przeznaczeniem, _ jak te jako pętlę. _ Stosując tę technikę, nale y uwzględnić jedną, Jako kolejny krok na drodze do stworzenia ogromnie wa ną uwagę. Nale y upewnić się, aplikacji totalizatora piłkarskiego online e funkcja posiada warunek wyjścia. Na przykład zapiszemy skrypt, który wykorzystuje funkcja o kodzie pokazanym poni ej będzie rekurencję oraz instrukcję UVCVKE. Skrypt ten działać w nieskończoność: będzie umo liwiał administratorowi HWPEVKQP CFFAQPG P ] wprowadzenie zwycięzców ka dego meczu, P  a następnie porównanie zwycięzcy z typami CFFAQPG P  poszczególnych graczy. _ CFFAQPG   Brak warunku określającego zakończenie obliczeń funkcji tworzy olbrzymi problem programistyczny — pętlę nieskończoną. Porównajmy funkcję pokazaną wy ej do następującej: HWPEVKQP EQWPVAVQA P ] KH P  ] GEJQ P DT DT  _ _ EQWPVAVQA   42
  • Zaawansowane programowanie w PHP Aby wykorzystać rekurencję GEJQ HQTO CEVKQP RTQEGUUAYKPPGTURJR åOGVJQF RQUV oraz instrukcję static: VCDNG DQTFGT  YKFVJ  EGNNURCEKPI å  EGNNRCFFKPI  CNKIP EGPVGT 1. W edytorze tekstowym otwieramy skrypt  make_picks_form.php (skrypt 1.5). Napiszemy skrypt nieco inny od tego, Chocia formularz ten będzie bardzo tak aby mo na było dokonać wyboru podobny do formularza w skrypcie zwycięzców. make_picks_form.php, to jednak będzie on obsługiwany inaczej — przez skrypt 2. Modyfikujemy wiersze 15. – 21. process_winner.php, który zapiszemy oryginalnego dokumentu tak, aby jako następny. formularz był obsługiwany przez inny skrypt oraz bez mo liwości wprowadzania danych przez u ytkowników (skrypt 1.8). Funkcje rekurencyjne i zmienne statyczne Skrypt 1.8. Skrypt pick_winners.php to tylko nieznaczna modyfikacja jego poprzednika — skryptu make_picks_form.php   &1%6;2' JVON 27$.+% 9%&6& :*6/.  6TCPUKVKQPCN2.  JVVRYYYYQTI644'%ZJVON&6&ZJVONVTCPUKVKQPCNFVF  JVON ZONPU JVVRYYYYQTIZJVON  JGCF  VKVNG 6QVCNKCVQT RK MCTUMKVKVNG  JGCF  DQF[  !RJR OCMGARKEMUAHQTORJR   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 RTQEGUUAYKPPGTURJR OGVJQF RQUV  VCDNG DQTFGT  YKFVJ  EGNNURCEKPI  EGNNRCFFKPI  CNKIP EGPVGT     HQTGCEJ ICOGU CU MG[  CTTC[ ]  <CUVQUQYCPKG VCDNKE[ FQ Y[ YKGVNGPKC MC FGL IT[   KH MG[   ]  9KGTUC )Q EKG )QURQFCTG PKG Y[ YKGVNCO[   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> YKPPGTU= MG[?> XCNWG> CYC[> CYC[VF  VF CNKIP> EGPVGT> XCNKIP> VQR> RTGEKYVF  VF CNKIP> TKIJV> XCNKIP> VQR> PQYTCR> PQYTCR> KPRWV V[RG> TCFKQ> PCOG> YKPPGTU= MG[?> XCNWG> JQOG> JQOGVF  VT >P  43
  • Rozdział 1. 3. Modyfikujemy wiersze 31. – 35. oryginalnego Skrypt 1.8. ciąg dalszy skryptu tak, aby wygenerowana tablica miała nazwę YKPPGTU.  _ GEJQ VT CNKIP> EGPVGT> XCNKIP> VQR>  _ VF CNKIP> NGHV> XCNKIP> VQR> PQYTCR>  å PQYTCR> KPRWV V[RG> TCFKQ> PCOG>   7WRG PKGPKG HQTOWNCTC K VCDGNK å YKPPGTU= MG[?> XCNWG> CYC[> CYC[VF  GEJQ VT CNKIP> EGPVGT> VF CNKIP> EGPVGT> XCNKIP> VQR> XCNKIP> VQR> å RTGEKYVF  VF EQNURCP> > YKFVJ>  > VF CNKIP> TKIJV> XCNKIP> VQR> PQYTCR CNKIP> EGPVGT> XCNKIP> VQR> å> PQYTCR> KPRWV V[RG> TCFKQ> PCOG KPRWV å> YKPPGTU= MG[?> XCNWG> JQOG> V[RG> UWDOKV> PCOG> UWDOKV> å JQOGVF XCNWG> 9[ NKL > VT >P   VT  VCDNG Ten krok nie jest absolutnie konieczny  KPRWV V[RG> JKFFGP> PCOG> YGGM> XCNWG> YGGM> Funkcje rekurencyjne i zmienne statyczne poza tym, e skrypt process_winners.php, obsługujący ten formularz, powinien  HQTO >P   otrzymać bardziej odpowiednie nazwy  _ GNUG ]  9[ YKGVNGPKG MQOWPKMCVW zmiennych ( YKPPGTU, a nie RKEMU). Q D úFKG LG GNK QVYCTEKG RNKMW PKG RQYKQF Q UKú 4. Zapisujemy skrypt jako pick_winners.php.  GEJQ 0KG OQ PC QVYQT[è RNKMW HKNG Zapiszemy teraz skrypt, obsługujący dane 0CNG [ WRGYPKè UKú E[ OKGPPC YGGM OC WUVCYKQPæ YCTVQ èDT DT  z formularza pick_winners.php.  _ 5. W edytorze tekstowym utworzymy nowy  !  DQF[ dokument HTML (skrypt 1.9).  JVON  &1%6;2' JVON 27$.+% 9%&6& :*6/. å 6TCPUKVKQPCN2. JVVRYYYYQTI644'%ZJVON å&6&ZJVONVTCPUKVKQPCNFVF JVON ZONPU JVVRYYYYQTIZJVON JGCF VKVNG 6QVCNKCVQT RK MCTUMKVKVNG JGCF 44
  • Zaawansowane programowanie w PHP Skrypt 1.9. W tym dość długim skrypcie wykorzystano zmienne statyczne oraz rekurencję w celu zapisu do plików, odczytywania danych z plików oraz wykonywania obliczeń   &1%6;2' JVON 27$.+% 9%&6& :*6/.  6TCPUKVKQPCN2.  JVVRYYYYQTI644'%ZJVON&6&ZJVONVTCPUKVKQPCNFVF  JVON ZONPU JVVRYYYYQTIZJVON  JGCF  VKVNG 6QVCNKCVQT RK MCTUMKVKVNG  JGCF  DQF[  !RJR    7UVCYKGPKG PWOGTW V[IQFPKC LCMQ UVC GL  FGHKPG 9''-  YGGM    
  • 
  •   
  • <CRKU Y[EKúEÎY Y RNKMW
  •  Funkcje rekurencyjne i zmienne statyczne  
  • 
  •    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 CVTCRC>P   HKTUVANKPG  647'  _   HRWVU HR XCNWG>P   &QFCPKG PCMW TGVWTP CD[ MC F[ CRKU PCNC UKú Y QUQDP[O YKGTUW  _   HKNG  RKEMUA  9''-  A9KPPGTUAVZV   9UMCCPKG PCY[ RNKMW Y HQTOCEKG RKEMUAA9KPPGTUAVZV    KH HR  "HQRGP HKNG Y ]  1VYCTEKG RNKMW FQ CRKUW   CTTC[AYCNM YKPPGTU YTKVGAFCVC  HR   9[U CPKG EC GL VCDNKE[ FQ HWPMELK YTKVGAFCVC  HENQUG HR   <COMPKúEKG RNKMW   GEJQ <CRKUCPQ Y[EKúEÎY DT DT    _ GNUG ]  9[ YKGVNGPKG D úFW Y RT[RCFMW IF[D[ QVYCTEKG RNKMW D[ Q PKGOQ NKYG  GEJQ 0KG OQ PC QVYQT[è RNKMW HKNG 2TQUú WRGYPKè UKú G OKGPPC YGGM OC YCTVQ è DT DT   _    
  • 
  •   
  • 2QDTCPKG V[RÎY ITCE[
  •   
  • 
  •  45
  • Rozdział 1. 1 Skrypt 1.9. ciąg dalszy   HWPEVKQP TGCFARKEMU FR FKTGEVQT[ ]  %[PPQ è Vú Y[MQPWLG HWPMELC TGCFARKEMU   INQDCN RKEMU   KH HKNGAPCOG  TGCFFKT FR ]  5RTCYFGPKG MC FGIQ RNKMW Y MCVCNQIW   KH UWDUVT HKNGAPCOG    RKEMUA ]  -QPV[PWCELC Y RT[RCFMW QFPCNGKGPKC RNKMW V[RCOK   RCTUGAHKNGAPCOG  GZRNQFG A  HKNGAPCOG   2TGMUVC EGPKG PCY[ RNKMW PC QFRQYKGFPK HQTOCV   KH RCTUGAHKNGAPCOG=?  9''- CPF RCTUGAHKNGAPCOG=?  9KPPGTU ]  ,G GNK VQ PKG LGUV RNKM FCP[OK Q Y[EKúECEJ C PWOGT V[IQFPKC LGUV Y C EKY[ Funkcje rekurencyjne i zmienne statyczne   WUGTPCOG  RCTUGAHKNGAPCOG=?  VJGAHKNG  FKTGEVQT[  HKNGAPCOG  WUGTUARKEMU  HKNG VJGAHKNG   RKEMU= WUGTPCOG?  WUGTUARKEMU  _  _   TGCFARKEMU FR FKTGEVQT[   -QNGLPC KVGTCELC HWPMELK  _  _   RKEMU  CTTC[   <CKPKELQYCPKG I ÎYPGL OKGPPGL   FKTGEVQT[     FR  QRGPFKT FKTGEVQT[   TGCFARKEMU FR FKTGEVQT[   ENQUGFKT FR     
  • 
  •   
  • 1DNKEGPKG V[IQFPKQY[EJ Y[PKMÎY
  •   
  • 
  •    YJKNG NKUV MG[ XCNWG  GCEJ RKEMU ]  2úVNC FNC Y[PKMÎY Y I ÎYPGL VCDNKE[   YKPU    7UVCYKGPKG PC YCTVQ è  FNC MC FGL VCDNKE[  NQUUGU    7UVCYKGPKG PC YCTVQ è  FNC MC FGL VCDNKE[   YJKNG NKUV MG[ XCNWG  GCEJ XCNWG ]  2úVNC FNC MC FGL VCDNKE[ W [VMQYPKMC   XCNWG  UWDUVT XCNWG  UVTNGP XCNWG     7UWPKúEKG PCMW TGVWTP   KH XCNWG  YKPPGTU= MG[? CPF MG[   ]  ,G GNK V[R W [VMQYPKMC LGUV Y C EKY[ RT[PCLGO[ OW RWPMV CNG PKG NKE[O[ YKGTUC PT  1 Je eli uruchamiamy skrypt w systemie Windows, wówczas nale y zapisać ten wiersz jako XCNWG  UWDUVT XCNWG  UVTNGP XCNWG    poniewa znak RETURN składa się w systemie Windows z dwóch znaków (CR+LF) — przyp. tłum. 46
  • Zaawansowane programowanie w PHP Skrypt 1.9. ciąg dalszy  YKPU   _ GNUGKH MG[   ]  NQUUGU   _  _   TGUWNVU= MG[?  CTTC[ YKPU  YKPU NQUUGU  NQUUGU   <CRKUCPKG Y[PKMÎY MC FGIQ W [VMQYPKMÎY Y VCDNKE[  _   MUQTV TGUWNVU   7RQTæFMQYCPKG VCDNKE[ CNHCDGV[EPKG    
  • 
  •   
  • <CRKUCPKG V[IQFPKQY[EJ Y[PKMÎY
  •  Funkcje rekurencyjne i zmienne statyczne  
  • 
  •    HWPEVKQP YTKVGATGUWNVU XCNWG MG[ HR ]  <CRKUWLG Y[PKMK FQ RNKMW   UVCVKE HKTUVANKPG   KH HKTUVANKPG ]  <CRKUCPKG RKGTYUGIQ YKGTUCCVTCR[ CNG V[NMQ TC  HRWVU HR )TCE>VRQRTCYPG>VD úFPG>P   &QFCPKG PCMW TGVWTP VCM CD[ MC F[ CRKU PCNC UKú Y QUQDP[O YKGTUW  HKTUVANKPG  647'  _   FCVC  KORNQFG >V  XCNWG   HRWVU HR MG[>V FCVC>P   &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    _ GNUG ]  9[ YKGVNGPKG MQOWPKMCVW Q D úFKG LG GNK QVYCTEKG RNKMW PKG RQYKQF Q UKú   GEJQ 0KG OQ PC QVYQT[è RNKMW V[IQFPKQY[OK Y[PKMCOK HKNGDT DT   _  !  DQF[  JVON 47
  • Rozdział 1. 6. Rozpoczniemy wpisywanie treści dokumentu Lista zwycięskich zespołów dla ka dego HTML oraz umieścimy inicjujący znacznik tygodnia będzie zapisywana w pliku pick_ PHP: 1_Winners_.txt (je eli jest to tydzień nr 1). DQF[ Pliki będą umieszczone w katalogu 2001. ! RJR 10. Zapiszemy instrukcję warunkową, która 7. Zdefiniujemy stałą WEEK otwiera plik i zapisuje w nim tablicę zwycięzców. FGHKPG 9''-  YGGM  KH HR  "HQRGP HKNG Y ] Poniewa nie chcemy, aby ta wartość ulegała CTTC[AYCNM YKPPGTU YTKVGAFCVC  HR  zmianie oraz ze względu na to, e musi ona HENQUG HR   <COMPKúEKG RNKMW być dostępna dla wielu funkcji, ustawiamy ją GEJQ <CRKUCPQ Y[EKúEÎY DT DT  jako stałą. _ GNUG ] GEJQ 0KG OQ PC QVYQT[è RNKMW HKNG 8. Stworzymy funkcję zapisującą listę å2TQUú WRGYPKè UKú G OKGPPC YGGM zwycięzców. OC YCTVQ èDT DT  Funkcje rekurencyjne i zmienne statyczne _ HWPEVKQP YTKVGAFCVC XCNWG MG[ HR ] UVCVKE HKTUVANKPG Kod ten jest bardzo podobny do KH HKTUVANKPG ] zapisanego w skrypcie store_picks.php. HRWVU HR 9KGTU CVTCRC>P  HKTUVANKPG  647' 11. Utworzymy funkcję, która pobiera _ wszystkie istniejące typy u ytkowników. HRWVU HR XCNWG>P  HWPEVKQP TGCFARKEMU FR FKTGEVQT[ ] _ INQDCN RKEMU Funkcja YTKVGAFCVC zasadniczo zapisuje KH HKNGAPCOG  TGCFFKT FR ] wiersz tekstu do pliku. Poniewa chcemy, å 5RTCYFGPKG MC FGIQ RNKMW Y MCVCNQIW KH UWDUVT HKNGAPCOG    RKEMUA ] aby pierwszy wiersz pliku był wierszem å RCTUGAHKNGAPCOG  GZRNQFG A  — atrapą, to stworzyliśmy instrukcję å HKNGAPCOG  warunkową, która zapisze ten wiersz, KH RCTUGAHKNGAPCOG=?  9''- CPF ale tylko wtedy, gdy pierwszy wiersz å RCTUGAHKNGAPCOG=?  9KPPGTU nie został jeszcze zapisany (nie chcielibyśmy, WUGTPCOG  RCTUGAHKNGAPCOG=? VJGAHKNG  FKTGEVQT[  HKNGAPCOG aby wiersz — atrapa był zapisywany WUGTUARKEMU  HKNG VJGAHKNG  za ka dym razem, kiedy wywołujemy tę RKEMU= WUGTPCOG?  WUGTUARKEMU funkcję). Poniewa zmienna HKTUVANKPG _ ustawiona na wartość 647' po zapisaniu _ pierwszego wiersza jest zadeklarowana jako TGCFARKEMU FR FKTGEVQT[  statyczna za pomocą instrukcji UVCVKE, _ zatem jej wartość będzie pamiętana w ka dej iteracji funkcji. Z tego powodu, kiedy funkcja zostanie wywołana po raz drugi, zmienna HKTUVANKPG będzie pamiętana jako 647' i instrukcja warunkowa nie wykona się. 9. Wybieramy plik do przetwarzania. HKNG  RKEMUA  9''-  å A9KPPGTUAVZV  48
  • Zaawansowane programowanie w PHP Funkcja ta wykonuje się w pętli (dzięki Mamy tu dwie pętle, pierwsza działa przedostatniemu wierszowi powodującemu dla wielowymiarowej tablicy RKEMU, rekurencję) dla wszystkich plików składającej się z wyników wytypowanych w katalogu, a do odczytania wszystkich przez u ytkowników w danym tygodniu. typów. Wtedy to warunek instrukcji Kolejna pętla działa w tablicy typów ka dego warunkowej przyjmie wartość HCNUG z graczy i sprawdza, czy gracz prawidłowo i funkcja nie wywoła samej siebie. wytypował zwycięzcę. Je eli tak się stało, W przypadku, kiedy plik spełnia kryteria zmienna YKPU jest zwiększana o 1, je eli pliku zawierającego typy u ytkownika nie — zwiększana jest zmienna NQUUGU. (tzn. UWDUVT HKNGAPCOG  RKEMUA , Ostatecznie zapisy są wprowadzane wówczas dane zostaną odczytane do wielowymiarowej tablicy TGUWNVU, i zapisane do globalnej tablicy RKEMU zawierającej liczbę trafnych i błędnych z wykorzystaniem nazwy u ytkownika typów poszczególnych graczy. jako indeksu. 14. Uporządkujemy alfabetycznie wyniki Funkcje rekurencyjne i zmienne statyczne 12. Utworzymy główną tablicę, rozpoznamy według nazwy u ytkownika. i otworzymy katalog, a następnie MUQTV TGUWNVU  wywołamy funkcję TGCFARKEMU  Tablica TGUWNVU w naszym przykładzie RKEMU  CTTC[  FKTGEVQT[    składa się teraz z czterech elementów pod FR  QRGPFKT FKTGEVQT[  indeksami Brian, Juan, Larry oraz Michael TGCFARKEMU FR FKTGEVQT[  (moi czterej u ytkownicy testowi). Ka dy ENQUGFKT FR  element wskazuje na inną tablicę, której 13. Zapiszemy pętlę, w której sprawdzimy indeksy to YKPU oraz NQUUGU. Funkcja MUQTV trafność typów poszczególnych graczy. posortuje pierwszy zestaw indeksów — nazwy u ytkowników w porządku YJKNG NKUV MG[ XCNWG  GCEJ alfabetycznym. Sortowanie nie będzie å RKEMU ] miało wpływu na pozostałe dane. YKPU   NQUUGU   15. Utworzymy funkcję, która zapisze wyniki YJKNG NKUV MG[ XCNWG  GCEJ dla określonego tygodnia. å XCNWG ] XCNWG  UWDUVT XCNWG  HWPEVKQP YTKVGATGUWNVU XCNWG MG[ HR ] å UVTNGP XCNWG    UVCVKE HKTUVANKPG KH XCNWG  YKPPGTU= MG[? CPF KH HKTUVANKPG ] å MG[   ] HRWVU HR )TCE>VRQRTCYPG>VD úFPG>P  YKPU  HKTUVANKPG  647' _ GNUGKH MG[   ] _ NQUUGU  FCVC  KORNQFG >V  XCNWG  _ HRWVU HR MG[>V FCVC>P  _ _ TGUWNVU= MG[?  CTTC[ YKPU  YKPU å NQUUGU  NQUUGU  Funkcja ta przypomina funkcję YTKVGAFCVC , _ z tą ró nicą, e wykorzystuje inny nagłówek. Ponownie wykorzystujemy zmienną statyczną, aby nagłówek był zapisywany tylko raz. 49
  • Rozdział 1. 16. Wskazujemy plik wyników i tworzymy instrukcję warunkową, która spowoduje wysłanie danych do tego pliku. HKNG  TGUWNVUA  9''-  AVZV  KH HR  "HQRGP HKNG Y ] CTTC[AYCNM TGUWNVU YTKVGATGUWNVU  å HR  HENQUG HR  GEJQ 9[PKMK CRKUCPQDT DT  _ GNUG ] GEJQ 0KG OQ PC QVYQT[è RNKMW åV[IQFPKQY[OK Y[PKMCOK HKNGDT DT  _ Jest to kolejna kopia kodu wywołującego funkcję YTKVGAFCVC , który wykorzystaliśmy Rysunek 1.11. Strona pick_winners.php wygląda Funkcje rekurencyjne i zmienne statyczne we wcześniejszej części skryptu. Kiedy podobnie do strony make_picks_form.php funkcja CTTC[AYCNM wyśle tablicę CTTC[ (rysunek 1.7) z tą ró nicą, e nie ma tu mo liwości do funkcji YTKVGATGUWNVU , wówczas wprowadzenia nazwy u ytkownika wszystkie poprawnie i błędnie wytypowane wyniki zostaną zapisane w pliku o nazwie results_1_.txt (dla tygodnia numer 1). Rysunek 1.12. Je eli skrypt process_winners.php wykona się poprawnie, zobaczymy te dwa komunikaty. Wynik działania skryptu mo emy sprawdzić, zaglądając do katalogu 2001 (rysunek 1.13) 50
  • Zaawansowane programowanie w PHP 17. Kończymy kod PHP oraz HTML ! DQF[ JVON 18. Zapisujemy plik jako process_winners.php, kopiujemy go do tego samego katalogu, co skrypt pick_winners.php (skrypt 1.8), a następnie uruchamiamy ten drugi skrypt w przeglądarce WWW (rysunki 1.11 oraz 1.12). 19. Mo emy te obejrzeć zawartość katalogu Rysunek 1.13. Katalog zawiera teraz plik pick_ 2001 (rysunek 1.13), a tak e zawartość pliku Winners_txt, który zawiera zwycięskie dru yny, results_1_.txt (skrypt 1.10). a tak e plik results_1_.txt, w którym znajdują się Funkcje rekurencyjne i zmienne statyczne informacje o trafności typów poszczególnych graczy Skrypt 1.10. Skrypt process_winners.php generuje taki oto plik z wynikami dla ka dego tygodnia, dla którego uruchomimy skrypt pick_winners.php. Plik z wynikami zawiera nazwy wszystkich u ytkowników oraz liczby trafnych i błędnych typów dla ka dego z nich  )TCE RQRTCYPG D úFPG  $TKCP    ,WCP    .CTT[    /KEJCGN   51
  • Rozdział 1. zmiennej — lub w definicji funkcji, wówczas Funkcje a odwołania będzie to dotyczyć ka dej zmiennej Domyślnie funkcje otrzymują argumenty przekazywanej do funkcji. według zasady wywołanie przez wartość. HWPEVKQP EJCPIGAXCNWG XCTKCDNG ] Oznacza to, e funkcja otrzymuje wartość XCTKCDNG  zmiennej, a nie samą zmienną. Aby uaktualnić GEJQ XCTKCDNG wartość zmiennej wewnątrz funkcji, nale y _ zastosować instrukcję INQDCN albo przekazać XCTKCDNG   EJCPIGAXCNWG XCTKCDNG  zmienną przez odwołanie. Teraz funkcja wyświetla wartość . Ten sam Oto przykład zwyczajnego działania funkcji: wynik mo na osiągnąć za pomocą HWPEVKQP EJCPIGAXCNWG XCTKCDNG ] następującej funkcji: XCTKCDNG  GEJQ XCTKCDNG HWPEVKQP EJCPIGAXCNWG XCTKCDNG ] _ XCTKCDNG  XCTKCDNG   GEJQ XCTKCDNG EJCPIGAXCNWG XCTKCDNG  _ XCTKCDNG   Instrukcja echo wyświetli wartość , ale wartość EJCPIGAXCNWG XCTKCDNG  zmiennej XCTKCDNG w dalszym ciągu wynosi  Ró nica w tym drugim przykładzie polega (pamiętajmy, e zmienna XCTKCDNG wewnątrz na tym, e ka da zmienna wysłana do funkcji Funkcje a odwołania funkcji, oprócz wspólnej nazwy, nie jest tym EJCPIGAXCNWG automatycznie przekazywana samym, czym poza nią). Je eli byśmy jednak jest przez adres. przekazali zmienną XCTKCDNG przez odwołanie, wówczas wartość zmiennej XCTKCDNG poza Zaletą wykorzystywania przekazywania funkcją tak e się zmieni. zmiennych przez adres jest fakt, e w takim przypadku zaoszczędza nam to kłopotów Aby przekazać zmienną przez odwołanie, a nie związanych z zastosowaniem zmiennych przez wartość, nazwę zmiennej nale y poprzedzić globalnych oraz zwracaniem wartości przez znakiem . Mo emy to zrobić w wierszu, funkcje. Przekonamy się o tym, kiedy w którym wywołujemy funkcję — w takim utworzymy ostatni skrypt w naszej aplikacji przypadku dotyczyć to będzie określonej totalizatora online. 52
  • Zaawansowane programowanie w PHP Aliasy Nowością w PHP4 jest mo liwość przekazywania parametrów przez adres niezale nie od funkcji. Składnia instrukcji słu ących do wykonywania tego typu czynności jest następująca: XCTKCDNG %JKECIQ %WDU  XCTKCDNG XCTKCDNG  OKGPPC XCTKCDNG LGUV MQRKæ OKGPPGL XCTKCDNG XCTKCDNG XCTKCDNG  OKGPPC XCTKCDNG LGUV QFYQ CPKGO FQ OKGPPGL XCTKCDNG XCTKCDNG 0CVKQPCN .GCIWG .GCFGTU   YCTVQ è OKGPPGL XCTKCDNG VQ 0CVKQPCN .GCIWG å.GCFGTU YCTVQ è OKGPPGL XCTKCDNG VQ Y FCNU[O EKæIW %JKECIQ %WDU XCTKCDNG  0CVKQPCN .GCIWG .GCFGTU  QDKG OKGPPG XCTKCDNG QTC XCTKCDNG OCLæ åYCTVQ è %JKECIQ %WDU 0CVKQPCN .GCIWG .GCFGTU Wykorzystując tego typu odwołania, tworzymy alias. W powy szym przykładzie zmienna XCTKCDNG jest aliasem zmiennej XCTKCDNG (wiersz, za pomocą którego utworzyliśmy ten alias, moglibyśmy tak e zapisać jako XCTKCDNG XCTKCDNG). Dowolne zmiany, dotyczące jednej ze zmiennych, będą automatycznie uwzględnione dla drugiej. Zastosowanie odwołań do zmiennych zamiast kopii mo e wpłynąć na poprawę wydajności aplikacji, szczególnie gdy mamy do czynienia z tablicami du ych rozmiarów oraz obiektami. Podczas gdy ka da kopia zmiennej zajmuje tyle samo miejsca w pamięci co oryginał, to alias zajmuje go znacznie mniej. Dobrą analogią do tej sytuacji jest skrót do dokumentu w naszym komputerze. Powiedzmy, Funkcje a odwołania e mamy dokument Venus.txt w folderze Astronomy i stworzyliśmy alias lub skrót do tego dokumentu (na przykład na pulpicie) o nazwie Evening_Star. Zarówno skrót, jak i sam dokument odwołują się do tej samej wartości (zawartości otwartego dokumentu) i dowolne zmiany tej zawartości będą uwzględnione niezale nie od tego, czy otworzymy dokument za pośrednictwem skrótu Evening_Star, czy te za pomocą oryginalnego pliku Venus.txt. Ró nica jest jednak taka, e plik Venus.txt ma 40 KB, podczas gdy skrót jedynie 2 KB. 53
  • Rozdział 1. Aby wykorzystać odwołania 4. Utworzymy funkcję, która odczytuje z plików wyniki ze wszystkich tygodni: 1. W edytorze tekstowym utworzymy nowy HWPEVKQP TGCFATGUWNVU FR FKTGEVQT[ dokument HTML (skrypt 1.11): å VQVCN ]  &1%6;2' JVON 27$.+% 9%&6& :*6/. KH HKNGAPCOG  TGCFFKT FR ] å 6TCPUKVKQPCN2. KH UWDUVT HKNGAPCOG    JVVRYYYYQTI644'%ZJVON å TGUWNVUA ] å&6&ZJVONVTCPUKVKQPCNFVF VJGAHKNG  FKTGEVQT[  HKNGAPCOG JVON ZONPU JVVRYYYYQTIZJVON CTTC[AYCNM HKNG VJGAHKNG  VKVNG 6QVCNKCVQT RK MCTUMKVKVNG å FQAVJGAOCVJ  VQVCN  JGCF _ DQF[ TGCFATGUWNVU FR FKTGEVQT[ VQVCN  _ 2. Rozpoczniemy wpisywanie treści dokumentu _ HTML oraz umieścimy inicjujący znacznik PHP: Funkcja TGCFATGUWNVU otrzymuje trzy argumenty — wskaźnik na katalog DQF[ (utworzony w momencie otwierania !RJR katalogu), nazwę katalogu oraz tablicę 3. Zapiszemy funkcję, która będzie sumować VQVCN. Ta ostatnia zmienna jest zawsze trafne i błędne typy. przekazywana przez odwołanie, a nie przez wartość, tak więc wszystkie dokonane Funkcje a odwołania HWPEVKQP FQAVJGAOCVJ XCNWG MG[ VQVCN ] KH MG[   ] zmiany dla tej zmiennej wewnątrz funkcji NKPG  GZRNQFG >V  XCNWG  będą dotyczyły zmiennej poza funkcją. WUGTPCOG  NKPG=? VQVCN= WUGTPCOG ?= YKPU ?  NKPG=? Funkcja TGCFATGUWNVU wykonuje się VQVCN= WUGTPCOG ?= NQUUGU ?  NKPG=? w pętli dla ka dego pliku w katalogu _ _ (zauwa my, e w funkcji zastosowano rekurencję — funkcja wywołuje samą Funkcja ta otrzymuje wartość z tablicy, jej siebie). W przypadku rozpoznania pliku indeks oraz tablicę VQVCN. Wartość, która z wynikami, który charakteryzuje się jest przekazywana w formacie 0#<9#A nazwą postaci results_WEEK_.txt, plik 7 ;6-190+-# =6#$? 64#(0' =6#$? $ ù&0' ten będzie odczytany do tablicy, a tablica =4'6740?, zostanie zdekomponowana pod zostanie przekazana przez odwołanie warunkiem, e nie jest to pierwszy element do funkcji FQAVJGAOCVJ . Dzięki temu tablicy ( MG[ ) — wiersz — atrapa. dowolne zmiany w tablicy VQVCN poza Następnie sumowane są trafne i błędne typy funkcją będą odzwierciedlone w obrębie danego u ytkownika. funkcji TGCFATGUWNVU . 54
  • Zaawansowane programowanie w PHP Skrypt 1.11. Ostatni skrypt w tej aplikacji WWW odczytuje wszystkie pliki z wynikami. Wykorzystano w nim odwołania w celu obliczenia podsumowań dla sezonu — do aktualnej daty   &1%6;2' JVON 27$.+% 9%&6& :*6/.  6TCPUKVKQPCN2.  JVVRYYYYQTI644'%ZJVON&6&ZJVONVTCPUKVKQPCNFVF  JVON ZONPU JVVRYYYYQTIZJVON  VKVNG 6QVCNKCVQT RK MCTUMKVKVNG  JGCF  DQF[  !RJR   
  • 
  •   
  • 1DNKEGPKG Y[PKMÎY UGQPW
  •   
  • 
  •    HWPEVKQP FQAVJGAOCVJ XCNWG MG[ VQVCN ]  (WPMELC UWOWLG VTCHPG K D úFPG V[R[ W [VMQYPKMÎY   KH MG[   ]  +IPQTWLGO[ RKGTYU[ YKGTU  CVTCRú   NKPG  GZRNQFG >V  XCNWG   9[FKGNCO[ PCYú W [VMQYPKMC QTC VTCHPG K D úFPG V[R[  WUGTPCOG  NKPG=? Funkcje a odwołania  VQVCN= WUGTPCOG ?= YKPU ?  NKPG=?  VQVCN= WUGTPCOG ?= NQUUGU ?  NKPG=?  _  _   HWPEVKQP TGCFATGUWNVU FR FKTGEVQT[ VQVCN ]   KH HKNGAPCOG  TGCFFKT FR ]  2TGUWMKYCPKG MCVCNQIW  KH UWDUVT HKNGAPCOG    TGUWNVUA ]  ,G GNK LGUV VQ RNKM Y[PKMCOK   VJGAHKNG  FKTGEVQT[  HKNGAPCOG  CTTC[AYCNM HKNG VJGAHKNG  FQAVJGAOCVJ  VQVCN   9[MQPCPKG QDNKEG FNC FCP[EJ  _  TGCFATGUWNVU FR FKTGEVQT[ VQVCN   2QYVCTCPKG QRGTCELK FNC MQNGLP[EJ RNKMÎY Y MCVCNQIW  _  _   VQVCN  CTTC[   <CKPKELQYCPKG I ÎYPGL OKGPPGL   FKTGEVQT[     FR  QRGPFKT FKTGEVQT[   TGCFATGUWNVU FR FKTGEVQT[ VQVCN   7TWEJQOKGPKG RTQEGUW  ENQUGFKT FR   GEJQ RTG >P   RTKPVAT VQVCN   5[DMKG Y[ YKGVNGPKG Y[PKMÎY  GEJQ RTG >P   !  DQF[  JVON 55
  • Rozdział 1. 5. Tworzymy główną zmienną, otwieramy katalog i rozpoczynamy proces obliczeń. VQVCN  CTTC[  FKTGEVQT[    FR  QRGPFKT FKTGEVQT[  TGCFATGUWNVU FR FKTGEVQT[ VQVCN  ENQUGFKT FR  6. Wyświetlamy obliczenia w przeglądarce WWW. GEJQ RTG >P  RTKPVAT VQVCN  GEJQ RTG >P  Rysunek 1.14. Jak widać, skrypt process_season.php Funkcja RTKPVAT pobiera zmienną jako po prostu wyświetla wyniki. Po uzyskaniu tej argument i wyświetla jej zawartość oraz informacji mo na ją bardzo łatwo przesłać strukturę. Dzięki temu funkcja ta jest bardzo pocztą elektroniczną u ytecznym sposobem szybkiej analizy skomplikowanych tablic i obiektów. Moglibyśmy te pobrać tę tablicę i w celu wyświetlenia wyników utworzyć formalną Funkcje a odwołania tabelę. Funkcja RTKPVAT jest nowością w PHP4. U ytkownicy wcześniejszej wersji powinni zamiast niej skorzystać z funkcji XCTAFWOR . 7. Zamykamy kod PHP oraz dokument HTML. ! DQF[ JVON 8. Zapisujemy ten plik pod nazwą process_ Rysunek 1.15. Funkcja var_dump() wyświetla te season.php, kopiujemy go na serwer same informacje, co funkcja print_r() (rysunek 1.14), i uruchamiamy w przeglądarce WWW ale zawiera nieco więcej danych (rysunek 1.14). 56
  • Zaawansowane programowanie w PHP Wskazówki Aby porównać funkcję RTKPVAT z funkcją XCTAFWOR , nale y zmienić ostatni wiersz w skrypcie process_season.php (skrypt 1.11) na XCTAFWOR VQVCN , a następnie uruchomić ten skrypt w przeglądarce (rysunek 1.15). Zastosowanie znaczników HTML RTG RTG powoduje wyświetlanie tablicy w przeglądarce w formacie źródła. Na rysunku 1.16 pokazano, jak wyglądałby wynik bez tych znaczników, chocia źródło (rysunek 1.17) jest czytelne. Rysunek 1.16. Próba wykonania funkcji print_r lub funkcji var_dump() bez znaczników <pre></pre> Więcej informacji na temat odwołań mo na powoduje wyświetlenie brzydkiego, nieczytelnego znaleźć pod adresem www.php.net/manual/ wyniku en/language.references.php. Funkcje a odwołania Rysunek 1.17. Przeglądanie źródła wyniku pokazanego na rysunku 1.16 powoduje poprawę jakości wyświetlania tablicy, która została wyświetlona przez funkcję var_dump(). W zasadzie odpowiada to rysunkowi 1.15, gdzie u yto znaczników <pre></pre> 57