Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00353 008378 10461751 na godz. na dobę w sumie
PHP. Almanach - książka
PHP. Almanach - książka
Autor: Liczba stron: 384
Wydawca: Helion Język publikacji: polski
ISBN: 83-246-0348-4 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> php - programowanie
Porównaj ceny (książka, ebook, audiobook).

Język PHP zyskał już liczne grono zadowolonych użytkowników. Jest wykorzystywany w witrynach internetowych do obsługi formularzy, wyświetlania treści z bazy danych i do wielu innych zadań. Co przysporzyło mu tak wielkiej popularności? Prosta składnia, wielkie możliwości i doskonała dokumentacja dostępna w sieci? Na pewno tak, ale jedną z jego największych zalet jest bezpłatna dystrybucja. Najnowsza wersja PHP, oznaczona numerem 5, to w pełni obiektowy język programowania pozwalający na korzystanie z niemal wszystkich nowoczesnych internetowych rozwiązań technologicznych -- języka XML, usług sieciowych czy protokołu SOAP.

Książka 'PHP. Almanach' to kompletny przewodnik po najnowszej wersji tego języka. Znajdują się w niej informacje na temat programowania obiektowego, tworzenia elementów dynamicznych witryn WWW i zabezpieczania aplikacji przed dostępem osób niepowołanych. Zamieszczono tu również opisy kilku najpopularniejszych rozszerzeń języka PHP, które mogą okazać się bardzo przydatne przy tworzeniu aplikacji internetowych.

W książce omówiona między innymi:

To obowiązkowa lektura każdego programisty PHP.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

IDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ SPIS TREŒCI SPIS TREŒCI KATALOG KSI¥¯EK KATALOG KSI¥¯EK KATALOG ONLINE KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK TWÓJ KOSZYK DODAJ DO KOSZYKA DODAJ DO KOSZYKA CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE ZAMÓW INFORMACJE O NOWOŒCIACH O NOWOŒCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl PHP. Almanach Autor: Paul Hudson T³umaczenie: Robert Górczyñski ISBN: 83-246-0348-4 Tytu³ orygina³u: PHP in a Nutshell Format: B5, stron: 384 Jêzyk PHP zyska³ ju¿ liczne grono zadowolonych u¿ytkowników. Jest wykorzystywany w witrynach internetowych do obs³ugi formularzy, wyœwietlania treœci z bazy danych i do wielu innych zadañ. Co przysporzy³o mu tak wielkiej popularnoœci? Prosta sk³adnia, wielkie mo¿liwoœci i doskona³a dokumentacja dostêpna w sieci? Na pewno tak, ale jedn¹ z jego najwiêkszych zalet jest bezp³atna dystrybucja. Najnowsza wersja PHP, oznaczona numerem 5, to w pe³ni obiektowy jêzyk programowania pozwalaj¹cy na korzystanie z niemal wszystkich nowoczesnych internetowych rozwi¹zañ technologicznych — jêzyka XML, us³ug sieciowych czy protoko³u SOAP. Ksi¹¿ka „PHP. Almanach” to kompletny przewodnik po najnowszej wersji tego jêzyka. Znajduj¹ siê w niej informacje na temat programowania obiektowego, tworzenia elementów dynamicznych witryn WWW i zabezpieczania aplikacji przed dostêpem osób niepowo³anych. Zamieszczono tu równie¿ opisy kilku najpopularniejszych rozszerzeñ jêzyka PHP, które mog¹ okazaæ siê bardzo przydatne przy tworzeniu aplikacji internetowych. W ksi¹¿ce omówiona miêdzy innymi: (cid:129) Instalacja PHP w Windows i Linuksie (cid:129) Podstawowe elementy jêzyka PHP (cid:129) Programowanie obiektowe (cid:129) Obs³uga formularzy na stronach WWW (cid:129) Zarz¹dzanie sesjami i plikami cookie (cid:129) Buforowanie danych wyjœciowych (cid:129) Operacje na plikach i bazach danych (cid:129) Generowanie grafiki, plików PDF i SWF (cid:129) Obs³uga plików XML (cid:129) Dystrybucja aplikacji (cid:129) Testowanie i usuwanie b³êdów (cid:129) Optymalizacja kodu To obowi¹zkowa lektura ka¿dego programisty PHP Wprowadzenie ...............................................................................................................9 1. Wprowadzenie do PHP ..................................................................................................13 13 14 16 20 20 Historia PHP Zalety PHP Uzyskiwanie pomocy Uzyskanie certyfikatu Źródła wiedzy o PHP 2. 3. Instalacja PHP ................................................................................................................23 23 Instalacja w systemie Windows 26 Instalacja w systemie Unix 29 Testowanie swojej konfiguracji Konfiguracja systemu 30 Interpreter PHP ..............................................................................................................31 31 Uruchamianie skryptów PHP Rozszerzanie PHP 32 33 PEAR Nieprawidłowe przerwanie wykonywania skryptu 34 4. Język PHP ....................................................................................................................... 37 37 38 40 40 41 41 41 42 Podstawy PHP Zmienne Wolne przestrzenie Heredoc Krótkie wprowadzenie do typów zmiennych Bloki kodu Otwarcie i zamknięcie bloków kodu Komentarze 3 Instrukcje warunkowe Case Switching Pętle Nieskończone pętle Specjalne słowa kluczowe pętli Pętle wewnątrz pętli Przetwarzanie trybów mieszanych Dołączanie innych plików Funkcje 42 44 46 48 48 49 51 51 53 5. Zmienne i stałe .............................................................................................................. 61 61 62 62 63 64 65 66 67 67 68 70 71 72 75 Typy danych Wartość true lub false Łańcuchy Liczby całkowite Liczby zmiennoprzecinkowe Automatyczna konwersja typu Sprawdzenie, czy zmienna jest ustalona: isset() Zasięg zmiennej Zmienne zmiennych Tablice superglobalne Używanie $_ENV oraz $_SERVER Odniesienia Stałe Tablice 6. Operatory ......................................................................................................................93 93 94 94 95 96 97 98 99 100 100 101 Operatory arytmetyczne Operatory przypisania Operatory łańcuchów Operatory poziomu bitowego Operatory porównania Operatory zwiększenia i zmniejszenia o jednostkę Operatory logiczne Kilka przykładów operatorów Operator trójkowy Operator wykonania Operator pierwszeństwa i asocjacyjny 7. Encyklopedia funkcji ................................................................................................... 103 104 104 Nieudokumentowane funkcje Obsługa znaków nieangielskich 4 | Spis treści 8. PHP zorientowany obiektowo ................................................................................... 145 145 146 148 149 150 150 151 157 158 159 162 163 164 165 168 169 170 172 Ogólny opis pojęcia Klasy Obiekty Właściwości Zmienna this Obiekty wewnątrz obiektów Modyfikatory kontroli dostępu Informacja o typie obiektu Wskazówki dotyczące typu klasy Konstruktory i destruktory Kopiowanie obiektów Porównywanie obiektów za pomocą == i === Zapisywanie obiektów Magiczne metody Statyczne metody i właściwości klas Przydatne funkcje pomocnicze Interfejsy Dereferencja wartości zwrotnych obiektu 9. Formularze HTML ........................................................................................................173 174 174 178 182 183 185 186 Co oznacza być dynamicznym? Projektowanie formularza Obsługa danych Rozdzielenie formularza na wiele stron Sprawdzanie poprawności danych wejściowych Projektowanie formularza Podsumowanie 10. Cookies i sesje ..............................................................................................................187 187 188 190 196 Cookies kontra sesje Używanie cookies Używanie sesji Przechowywanie złożonych typów danych 11. Buforowanie danych wyjściowych .............................................................................197 197 198 198 199 199 200 Dlaczego używać buforowania danych wyjściowych? Rozpoczynamy Ponowne używanie buforów Bufory kaskadowe Opróżnianie buforów kaskadowych Odczytywanie buforów Spis treści | 5 Inne funkcje OB Opróżnianie danych wyjściowych Kompresja danych wyjściowych Przepisywanie URL 201 201 203 204 12. Bezpieczeństwo .......................................................................................................... 207 207 209 Podpowiedzi dotyczące bezpieczeństwa Szyfrowanie 13. Pliki .............................................................................................................................. 213 213 217 219 220 221 222 222 223 225 226 227 228 229 231 231 231 Odczytywanie plików Tworzenie i zmiana plików Przenoszenie, kopiowanie i usuwanie plików Inne funkcje dotyczące plików Sprawdzenie, czy plik istnieje Otrzymywanie informacji dotyczących czasu pliku Szczegółowa analiza informacji w nazwie pliku Obsługa przekazywania plików na serwer Blokowanie plików za pomocą funkcji flock() Odczytywanie praw dostępu pliku i jego statusu Zmiana prawa dostępu i własności pliku Praca z dowiązaniami Praca z katalogami Zdalne pliki Sumy kontrolne plików Przetwarzanie pliku konfiguracyjnego 14. Bazy danych ................................................................................................................235 235 242 247 251 252 Używanie MySQL z PHP PEAR::DB SQLite Stałe połączenia Udoskonalony MySQL 15. Wyrażenia regularne ..................................................................................................253 253 254 254 258 258 259 260 261 Podstawy regexps: preg_match() i preg_match_all() Klasy znaków regexps Znaki specjalne wyrażeń regularnych Słowa i wolne przestrzenie wyrażeń regularnych Przechowywanie dopasowanych łańcuchów Zastępowanie wyrażeniami regularnymi Przykłady składni wyrażeń regularnych Program „Regex Coach” 6 | Spis treści 16. Operacje na obrazkach ...............................................................................................263 263 265 266 267 269 270 273 275 277 278 280 282 285 287 290 290 Rozpoczynamy Wybór formatu Rozpoczynamy tworzenie Więcej kształtów Złożone kształty Wyświetlanie tekstu Wczytywanie istniejących obrazków Kolor i wypełnianie obrazka Dodanie przezroczystości Używanie pędzli Podstawy kopiowania obrazków Skalowanie i rotacja Punkty i linie Efekty specjalne uzyskane za pomocą funkcji imagefilter() Przeplot obrazka Pobieranie typu MIME obrazka 17. Tworzenie plików PDF ................................................................................................293 293 295 296 297 297 Rozpoczynamy Dodanie większej liczby stron oraz dodatkowych stylów Dodanie obrazków Efekty specjalne PDF Dołączenie danych dokumentu 18. Tworzenie klipów Flash .............................................................................................299 299 301 302 304 Prosty klip Tekst w klipach Flash Akcje Animacja 19. XML XSLT ................................................................................................................. 307 307 313 Rozszerzenie SimpleXML Transformacja XML za pomocą XSLT 20. Programowanie sieciowe ........................................................................................... 315 315 318 322 329 Gniazda HTTP Wysyłanie wiadomości e-mail Curl Spis treści | 7 21. Rozprowadzanie swojego kodu ................................................................................ 337 337 338 338 339 Kod niezależny od platformy 1: wczytywanie rozszerzeń Kod niezależny od platformy 2: używanie rozszerzeń Kod niezależny od platformy 3: ścieżki i separatory wierszy Kod niezależny od platformy 4: różnice w pliku php.ini Kod niezależny od platformy 5: sprawdzanie wersji PHP za pomocą funkcji phpversion() i version_compare() 340 22. Debugowanie .............................................................................................................. 341 341 342 344 345 345 346 347 350 351 354 354 355 355 Najbardziej podstawowa technika debugowania Tworzenie warunków Zgłaszanie swoich błędów Testowanie za pomocą funkcji php_check_syntax() Kolorowanie kodu źródłowego Obsługa błędów MySQL Obsługa wyjątków Wsteczne przeglądanie swojego kodu Własna obsługa błędów Własna obsługa wyjątków Użycie symbolu @ do zablokowania błędów Funkcja phpinfo() Styl danych wyjściowych 23. Wydajność ...................................................................................................................359 359 360 360 360 361 361 361 362 Rozsądnie napisz swój kod Użycie Zend Optimizer Użycie bufora kodu PHP Kompresja danych wyjściowych Nie używaj CGI Przeprowadź debugowanie swojego kodu Używaj stałych połączeń Prawidłowa kompilacja Skorowidz ...................................................................................................................363 8 | Spis treści ROZDZIAŁ 4. Niniejszy rozdział stanowi kompletne wprowadzenie do podstaw programowania PHP; przed- stawia zmienne, komentarze, instrukcje warunkowe, pętle oraz inne konstrukcje. Jeżeli po- siadasz niewielkie doświadczenie w PHP, najlepiej rozpocząć pracę właśnie od lektury tego rozdziału. W przeciwnym przypadku możesz zapoznać się z poszczególnymi jego fragmen- tami w celu odświeżenia pamięci. Podstawy PHP PHP działa domyślnie z wyłączonym trybem PHP, co oznacza, że dopóki tryb PHP nie zo- stanie włączony, zawartość będzie traktowana jako zwykły tekst, a nie jako kod PHP. Taka metoda analizy powoduje, że elementy skryptu PHP są „blokami kodu” — samodzielnymi fragmentami kodu, które mogą działać niezależnie od otaczającego je kodu HTML. W celu oznaczenia typu skryptów PHP są one zwykle zapisywane z rozszerzeniem .php. Ile- kroć Twój serwer WWW zostanie poproszony o wysłanie pliku kończącego się na .php, wów- czas w pierwszej kolejności przekaże plik do interpretera PHP. Z kolei interpreter wykona kod zawarty w skrypcie, a następnie zwróci użytkownikowi wygenerowany plik. Podstawowa jednostka kodu PHP jest nazwana poleceniem i kończy się znakiem średnika oznaczającym zakończenie polecenia. W celu zachowania przejrzystości jeden wiersz kodu zazwyczaj za- wiera jedno polecenie, choć możesz umieścić w nim tyle poleceń, ile tylko zechcesz. Poniższe dwa przykłady wykonują to samo zadanie: ?php // opcja 1 print Witaj, ; print świecie! ; // opcja 2 print Witaj, ; print świecie! ; ? Puryści PHP wskazują, że technicznie rzecz biorąc print nie jest funkcją i z tego punktu wi- dzenia mają rację. Dlatego też polecenie print nie wymaga nawiasów klamrowych wokół prze- kazywanych do niego danych. Do innych konstrukcji języka, które maskują się jako funkcje (i wspominamy tutaj o nich ze względu na zachowanie porządku), należą polecenia: array, echo, include, require, return i exit. 37 Możesz użyć nawiasów z tymi konstrukcjami; jest to zupełnie nieszkodliwe: ?php print( Witaj! ); ? Chociaż na pierwszy rzut oka polecenia print i echo wydają się identyczne, to jednak nie są. W przeciwieństwie do polecenia echo, konstrukcja print zachowuje się bardziej jako funkcja, ponieważ zwraca wartość (1). Jednakże polecenie echo jest bardziej użyteczne, gdyż możesz do niego przekazać wiele parametrów, na przykład w ten sposób: ?php echo To , jest , test. ; ? Aby uzyskać taki sam efekt za pomocą konstrukcji print, zamiast znaku przecinka musiałbyś użyć operatora połączenia (.) i połączyć ze sobą łańcuchy. Jeżeli, podobnie jak w powyższym przykładzie, posiadasz kilka elementów do wyświetlenia, wówczas ze względu na zachowanie przejrzystości zalecane jest użycie polecenia echo. Zmienne Zmienne w PHP — czyli elementy, które przechowują dane — rozpoczynają się znakiem $, następnie występuje znak podkreślenia lub litera, a dalej kombinacja liter, cyfr i znaków pod- kreślenia. Oznacza to, że nie możesz rozpocząć nazwy zmiennej od cyfry. Jednym godnym uwagi wyjątkiem w ogólnym schemacie nazewnictwa zmiennych są „zmienne zmiennych”, które zostaną przedstawione w kolejnym rozdziale. Lista poprawnych i niepoprawnych nazw zmiennych została przedstawiona w tabeli 4.1. Tabela 4.1. Poprawne i niepoprawne nazwy zmiennych $mojazmienna $Imie $_Wiek $___WIEK___ $91 $1Imie $Imie91 $_Imie91 $Imie s Poprawna nazwa. Poprawna nazwa. Poprawna nazwa. Poprawna nazwa. Niepoprawna nazwa, rozpoczyna się cyfrą. Niepoprawna nazwa, rozpoczyna się cyfrą. Poprawna nazwa, cyfry są poprawne, jeśli są na końcu i po pierwszym znaku. Poprawna nazwa. Niepoprawna nazwa, nie są dozwolone inne symbole niż „_”, a więc apostrof jest niedozwolony. Zmienne rozróżniają wielkość liter, co oznacza, że zmienna $Foo nie jest tą samą zmienną co: $foo, $FOO lub $fOO. Przypisywanie zmiennych jest tak proste jak używanie na zmiennej operatora przypisania (=), a następnie podanie wartości, która ma zostać przypisana. Poniżej znajduje się prosty skrypt przedstawiający przypisanie oraz dane wyjściowe. Zwróć uwagę na znaki średnika użyte na końcu każdego polecenia: 38 | Rozdział 4. Język PHP ?php $imie = Paweł ; print Twoje imię to $imie ; $imie2 = $imie; $wiek = 20; print Twoje imię to $imie2, a Twój wiek to $wiek lat ; print Do widzenia, $imie! ; ? W powyższym przykładzie zmiennej $imie przypisaliśmy łańcuch Paweł, a PHP pozwolił nam wyświetlić tę zmienną po fragmencie „Twoje imię to”. Ponieważ PHP w każdym znale- zionym przez siebie miejscu (lub wewnątrz łańcuchów ujętych w podwójny znak cudzysłowu, to znaczy rozpoczynające się i kończące na ) wystąpienia zmiennej $imie zastąpił zmienną jej wartością, dane wyjściowe z pierwszego polecenia to „Twoje imię to Paweł”. Następnie ustawiamy zmienną $imie2, aby była zmienną $imie, co powoduje skopiowanie wartości zmiennej $imie do zmiennej $imie2. Po tej operacji zmienna $imie2 ma wartość Paweł. Ustawiamy również zmienną $wiek i przypisujemy jej wartość 20. Nasze drugie polecenie print wyświetla jednocześnie obie zmienne. I tym razem PHP zastępuje zmienne ich rzeczywistymi wartościami. Jednakże ostatnie polecenie print nie zastąpi zmiennej $imie wartością Paweł. Zamiast tego zostanie wyświetlone: Do widzenia, $imie! Powodem takiego stanu rzeczy jest fakt, że PHP nie wykonuje zastąpienia zmiennej wewnątrz łańcuchów ujętych w znaki pojedynczego cudzysłowu oraz nie zastępuje większości znaków sterujących (wyjątkiem jest ). W łańcuchach ujętych w podwójne znaki cudzysłowu PHP zastąpi zmienną $imie jej wartością, natomiast w łańcuchu ujętym w pojedyncze znaki cu- dzysłowu PHP interpretuje, że chcesz otrzymać tekst $imie jako dane wyjściowe. Kiedy chcesz dodać cokolwiek do swojej zmiennej wewnątrz łańcucha, PHP może uznać te znaki za część zmiennej. Na przykład: ?php $owoc = grejpfrut ; print Te $owocy nie są jeszcze dojrzałe. ; ? Podczas gdy pożądanymi danymi wyjściowymi było zdanie „Te grejpfruty nie są jeszcze doj- rzałe.”, to jednak rzeczywiste dane wyjściowe są inne. Ponieważ dodaliśmy znak „y” na końcu nazwy zmiennej, zmieniliśmy ją z $owoc na $owocy. Zmienna $owocy nie istnieje, więc PHP pozostawił puste miejsce i może wygenerować błąd. Są dwa sposoby rozwiązania tego typu sytuacji: ?php $owoc = grejpfrut ; print Te ${owoc}y nie są jeszcze dojrzałe. ; print Te {$owoc}y nie są jeszcze dojrzałe. ; ? Nawiasy { i } używane wewnątrz łańcucha technicznie oznaczają zmienną zmiennej, ale w przy- kładzie przedstawionym powyżej informują PHP, w którym miejscu następuje koniec zmien- nej. Nie musisz używać nawiasów wówczas, gdy dodawane do zmiennej znaki powodują, że nazwa zmiennej staje się niepoprawna, na przykład w poniższej sytuacji: Zmienne | 39 ?php $owoc = grejpfrut ; print Smak tego $owoc u nie jest dobry. ; ? Taki zapis będzie funkcjonował, ponieważ nie wolno używać apostrofów jako części nazwy zmiennej. Wolne przestrzenie Znaki odstępu, tabulatory i puste wiersze między poleceniami nie mają wpływu na sposób wykonywania kodu. Dla PHP następny przedstawiony skrypt jest traktowany jak każdy inny, niezależnie od faktu, że niektóre polecenia są w tym samym wierszu, a inne zostały rozbite na kilka wierszy: ?php $imie = Paweł ; print Twoje imię to $imie ; $imie2 = $imie; $wiek = 20; print Twoje imię to $imie2, a Twój wiek to $wiek lat ; print Do widzenia, $imie! ; ? Należy używać wolnych przestrzeni do rozdzielenia Twojego kodu na czytelne bloki, tak aby ich znaczenie było łatwe do zrozumienia dzięki wizualnemu przedstawieniu rozmieszczenia. Heredoc Jeżeli posiadasz długi łańcuch, możesz rozważyć użycie składni heredoc. W zasadzie heredoc pozwala Ci na zdefiniowanie własnych ograniczników łańcucha, tak więc możesz użyć in- nych znaków niż pojedynczy lub podwójny cudzysłów. Na przykład możemy użyć łańcu- cha EOT (end of text — koniec tekstu) jako naszego ogranicznika. Dzięki temu pozbywamy się z głównej części tekstu znaków pojedynczego i podwójnego cudzysłowu — łańcuch zostanie zakończony jedynie po wpisaniu EOT. Wydaje się to trochę bardziej skomplikowanie niż jest w praktyce. Ogranicznik łańcucha musi być jedynym elementem od samego początku wiersza. Oznacza to, że nie możesz dodać wo- kół niego znaków odstępu bądź tabulatorów. Poniżej jest przedstawiony działający przykład tego typu składni: ?php $mojlancuch = EOT To jest pewien tekst PHP. Tekst jest całkowicie dowolny. Mogę w nim użyć znaków podwójny cudzysłów oraz pojedynczy cudzysłów , a nawet $zmiennych, które zostaną prawidłowo zamienione na ich wartości. Możesz nawet wpisać łańcuch EOT, tak długo jak nie będzie on jedynym łańcuchem w wierszu, jak ma to miejsce poniżej: EOT; ? 40 | Rozdział 4. Język PHP Należy zwrócić uwagę na kilka ważnych informacji o heredoc oraz powyższym przykładzie: • Możesz użyć dowolnych znaków jako ogranicznika łańcucha, EOT jest tylko przykładem. • Przed ogranicznikiem musisz użyć zapisu w celu poinformowania PHP, że chcesz wejść do trybu heredoc. • Włączone jest zastępowanie zmiennych, co oznacza, że musisz zmienić znaczenie znaku dolara, jeśli nie chcesz, aby PHP zastąpiło zmienną jej wartością. • Możesz użyć ogranicznika w dowolnym miejscu w tekście, z wyjątkiem pierwszej kolumny nowego wiersza. • Na końcu łańcucha wpisz ogranicznik bez otaczających go wolnych przestrzeni, a następ- nie dodaj znak średnika. Bez składni heredoc skomplikowane przypisania łańcuchów mogłyby być bardzo zawiłe. Krótkie wprowadzenie do typów zmiennych Zmienne w PHP mogą być typu: całkowitego (liczby całkowite), zmiennoprzecinkowego (zwy- kle nazywane „float”; są to liczby zmiennoprzecinkowe), łańcuch (zestaw znaków), tablica (grupa danych), obiekt (kompleksowe połączenie danych i funkcjonalności) lub zasób (jakie- kolwiek zewnętrzne dane, na przykład obrazek). Poszczególne typy poznamy bardziej szcze- gółowo w dalszej części książki. W chwili obecnej musimy jedynie wiedzieć, czym są zmienne i jak one działają. Bloki kodu PHP dość intensywnie korzysta z bloków kodu — porcji kodu PHP, który jest oddzielony od pozostałej części skryptu. W trakcie czytania dalszych podrozdziałów tego rozdziału zauwa- żysz, że PHP używa nawiasów klamrowych { i } do otwarcia i zamknięcia bloków kodu. Otwarcie i zamknięcie bloków kodu Istnieje wiele sposobów na otwarcie bloku kodu PHP (przejście do trybu analizy składniowej PHP); wybierz ten, który odpowiada Ci najbardziej. Zalecanym sposobem jest użycie znacznika ?php w celu wejścia do trybu PHP oraz ? do opuszczenia trybu PHP, choć możesz również skorzystać ze skróconych wersji znaczników, ? i ? . Skrócony zapis ma jedną dużą zaletę oraz dwie poważne wady: możesz otrzymać dane wyj- ściowe ze swojego skryptu dzięki użyciu specjalnego zapisu ?=, jak ma to miejsce w poniższym przykładzie: ?= Witaj, świecie! ? Poniżej znajduje się odpowiednik przedstawionego wyżej skryptu, tym razem napisany przy użyciu standardowych otwierających i zamykających znaczników PHP: ?php print Witaj, świecie! ; ? Otwarcie i zamknięcie bloków kodu | 41 Skrócona wersja znaczników jest zatem bardziej zwięzła, ale trochę trudniejsza do czytania. Jednakże pierwszą wadą skróconego zapisu znaczników PHP jest fakt, że nakładają się z XML (i przez to także z XHTML), które również używają zapisu ? do otwarcia bloku kodu. Oczy- wiście, oznacza to, że jeśli będziesz próbował użyć razem XML oraz skróconych znaczników PHP, wówczas napotkasz problemy. Mamy więc pierwszy powód, dla którego zaleca się uży- wanie standardowych otwierających i zamykających znaczników PHP. Skrócone znaczniki są zawsze niebezpieczne, ponieważ mogą zostać zablokowane w pliku konfiguracyjnym PHP, php.ini. Prowadzi to do tego, że Twoje skrypty nie będą przenośne. Istnieją również dwa inne, rzadziej używane warianty. Pierwszy z nich, , otwiera i zamy- ka blok kodu w taki sam sposób, w jaki robi to Microsoft ASP. Drugim zapisem jest script language= php /script . Te dwa warianty często sprawują się lepiej w graficznych edy- torach WWW, takich jak Macromedia Dreamweaver lub Microsoft FrontPage. Nie są jed- nak zalecane do ogólnego użycia, ponieważ muszą zostać włączone, aby mogły funkcjono- wać prawidłowo. Możesz przejść do trybu PHP oraz z niego wyjść używając znaczników ?php i ? — gdzie- kolwiek i jak często zechcesz. Komentarze Znajdując się w trybie PHP możesz zaznaczyć określone części kodu jako komentarz, a te frag- menty nie powinny zostać wykonane. Mamy trzy sposoby oznaczenia tekstu jako komentarz: //, /* */ oraz #. Zapisy // i # oznaczają: „Zignoruj pozostałą część wiersza”, podczas gdy za- pis /* oznacza: „Zignoruj wszystko, dopóki nie natkniesz się na */”. W trakcie stosowania zapisu /* */ występują pewne komplikacje, co powoduje, że ten sposób jest mniej pożądany w uży- ciu. ?php print To zostanie wyświetlone ; // print To nie zostanie wyświetlone ; # print To nie zostanie wyświetlone ; print To zostanie wyświetlone ; /* print To nie zostanie wyświetlone ; print To nie zostanie wyświetlone ; */ ? Powyższy fragment kodu przedstawia w działaniu wszystkie trzy typu komentarzy, ale nie pokazuje problemu związanego ze stylem komentowania /* */. Jeżeli rozpocząłeś zapisem /* komentarz w jednym wierszu, a zakończyłeś go znacznie niżej, gdzie rozpoczął się inny ko- mentarz stylu /*, wówczas stwierdzisz, że skrypt nie działa. Jest to spowodowane faktem, że nie możesz gromadzić lub „zagnieżdżać” komentarzy stylu /* */. Próba takiego działania za- kończy się spektakularnym niepowodzeniem. Najlepszym wyjściem w celu komentowania jest zastosowanie komentarzy typu //, ponieważ są one proste, łatwe do zlokalizowania, odczytania i kontrolowania. Instrukcje warunkowe PHP pozwala na wybór podejmowanej akcji, w zależności od wyników spełnienia warunku. Warunek może zostać dowolnie przez Ciebie wybrany; dysponujesz również możliwością łą- 42 | Rozdział 4. Język PHP czenia warunków, co pozwala na tworzenie bardziej skomplikowanych akcji. Poniżej znajduje się działający przykład: ?php $Wiek = 20; if ($Wiek 18) { print Jesteś zbyt młody - baw się dobrze! ; } else { print Nie masz poniżej 18 lat. ; } if ($Wiek = 18 $Wiek 50) { print Jesteś w najlepszym okresie swojego życia! ; } else { print Nie jesteś w najlepszym okresie swojego życia. ; } if ($Wiek = 50) { print Będziesz mógł wkrótce odpocząć - hurra! ; } else { print Nie będziesz mógł wkrótce odpocząć :-( ; } ? Na najbardziej podstawowym poziomie PHP ocenia polecenie if od lewej do prawej strony, co oznacza, że w pierwszej kolejności jest sprawdzane, czy zmienna $Wiek jest równa bądź większa od 18. Dopiero w dalszej kolejności następuje sprawdzenie, czy zmienna $Wiek jest mniejsza od 50. Podwójny znak oznacza, że oba wyrażenia muszą przyjąć wartość true, aby został wykonany fragment kodu print Jesteś w najlepszym okresie swojego życia . Jeżeli z jakiegokolwiek powodu jeden z warunków nie przyjmuje wartości true, wówczas zostanie wyświetlone zdanie: „Nie jesteś w najlepszym okresie swojego życia”. Kolej- ność, w której są sprawdzane warunki, jest uzależniona od pierwszeństwa operatora. Zagad- nienia związane z pierwszeństwem operatorów zostaną omówione w następnym rozdziale. Oprócz operatora występuje również operator || (podwójna pionowa linia), który ozna- cza OR (lub). W takiej sytuacji całe wyrażenie przyjmuje wartość true, jeżeli jeden z warunków przyjmie wartość true. Mamy kilka sposobów na porównanie dwóch liczb. Do tej pory poznaliśmy (mniejszy niż), = (mniejszy bądź równy) i = (większy bądź równy). Pełną listę zaprezentujemy dalej, ale w pierwszej kolejności należy wspomnieć o jednym ważnym operatorze: == (dwa znaki równo- ści obok siebie). Oznaczają one „jest równy”. Dlatego też warunek 1 == 1 jest prawdziwy, natomiast 1 == 2 nie jest prawdziwy. Kod przeznaczony do wykonania w instrukcjach warunkowych if jest umieszczony w swoim własnym bloku kodu (pamiętaj, blok kodu rozpoczyna się nawiasem klamrowym {, a kończy nawiasem klamrowym }). Natomiast kod przeznaczony do wykonania w przypadku, gdy wa- runek nie zostanie spełniony, znajduje się w bloku else. Dzięki takiemu układowi PHP nie będzie próbował wykonać kodu zarówno wtedy, gdy wyrażenie przyjmuje zarówno wartość true, jak i false. Jedną kwestią wartą odnotowania jest fakt, że PHP praktykuje „jak najkrótsze polecenie if” — będzie próbował wykonać minimalną dopuszczalną liczbę warunków. W zasadzie przesta- nie sprawdzać warunki, gdy tylko upewni się, że może to zrobić. Na przykład: if ($Wiek 10 $Wiek 20) Instrukcje warunkowe | 43 Jeżeli zmienna $Wiek przyjmie wartość 8, wówczas pierwszy warunek ($Wiek 10) przyjmie wartość false. PHP nie będzie więc sprawdzać drugiego warunku. Oznacza to, na przykład, że możesz sprawdzić, czy zmienna została ustalona i czy posiada określoną wartość. Jeżeli zmienna nie została ustalona, PHP skróci instrukcję if i nie będzie sprawdzać jej wartości. Jest to prawidłowe działanie, ponieważ jeśli będziesz sprawdzać wartość nieustalonej zmiennej, wówczas PHP zgłosi błąd. Pomocnym dodatkiem do instrukcji if jest polecenie elseif, które pozwala na łączne spraw- dzenie warunków w bardziej inteligentny sposób: ?php if ($Wiek 10) { print Masz poniżej 10 lat ; } elseif ($Wiek 20) { print Masz poniżej 20 lat ; } elseif ($Wiek 30) { print Masz poniżej 30 lat ; } elseif ($Wiek 40) { print Masz poniżej 40 lat ; } else { print Masz ponad 40 lat ; } ? Użytkownicy Perla powinni zwrócić uwagę, że piszemy elseif, a nie elsif. Ten sam efekt możesz uzyskać za pomocą poleceń if, ale użycie elseif jest łatwiejsze do odczytania. Ujemną stroną takiego rozwiązania jest to, że zmienna $Wiek musi zostać ponow- nie sprawdzona. Jeżeli posiadasz tylko jedno polecenie kodu do wykonania, możesz się zupełnie obejść bez nawiasów klamrowych. Taki wariant jest bardzo czytelny. Poniżej są dwa fragmenty kodu, których wynik jest identyczny: if ($zablokowany) { print Nie masz wstępu! ; } if ($zablokowany) print Nie masz wstępu! ; Case Switching Twoje bloki kodu if...elseif mogą osiągnąć duże rozmiary, kiedy będziesz sprawdzał wiele warunków względem tej samej zmiennej, jak zostało to przedstawione poniżej: ?php $imie = Bartek ; if ($imie == Janek ) { print Twoje imię to Janek ; } elseif ($imie == Lidia ) { print Twoje imię to Lidia ; } elseif ($imie == Bartek ) { print Twoje imię to Bartek ; } elseif ($imie == Stasia ) { print Twoje imię to Stasia ; 44 | Rozdział 4. Język PHP } else { print Nie wiem, jak masz na imię! ; } ? PHP posiada odpowiednie rozwiązanie dla takich sytuacji: switch/case. W bloku instrukcji switch/case określasz sprawdzany warunek oraz podajesz listę możliwych wartości, które chcesz obsłużyć. Używając poleceń switch/case możemy przepisać w następujący sposób nasz poprzedni skrypt: ?php $imie = Bartek ; switch($imie) { case Janek : print Twoje imię to Janek ; break; case Lidia : print Twoje imię to Lidia ; break; case Bartek : print Twoje imię to Bartek ; break; case Stasia : print Twoje imię to Stasia ; break; default: print Nie wiem, jak masz na imię! ; } ? Polecenia switch/case są często używane do sprawdzenia różnego rodzaju danych i zabierają znacznie mniej miejsca niż odpowiadające im polecenia if. Mamy dwie istotne kwestie warte odnotowania w kodzie poleceń switch/case PHP. Po pierwsze, przed zapisem „default” nie umieszczamy słowa case — jest to po prostu sposób działania języka. Po drugie, każdą z akcji case kończymy poleceniem „break;”. Jest to spo- wodowane faktem, że kiedy PHP odnajdzie na liście pasujący warunek, wykona przypisaną do niego akcję oraz akcje wszystkich pozostałych odpowiadających warunków umieszczonych po- niżej (na ekranie przedstawionych na dole). Taki sposób działania został zaczerpnięty bezpo- średnio z języka C i w zasadzie jest sprzeczny z intuicją oraz naszym sposobem myślenia. Rzadko się zdarza sytuacja, w której chciałbyś wykluczyć polecenie break z końca swoich warunków case. Warunek default zostanie wykonany, jeżeli PHP nie znajdzie odpowiadającej wartości w in- nych warunkach lub jeśli został wykonany poprzedzający go warunek, który nie posiadał pole- cenia break. Słowo kluczowe „break” oznacza „Wyjdź z polecenia switch/case”, a efektem jego działania jest zatrzymanie wykonywania przez PHP akcji z wszystkich warunków case, które znajdują się po znalezieniu tego pasującego. Bez tego polecenia nasz skrypt spowodowałby wyświetlenie: Twoje imię to Bartek Twoje imię to Stasia Nie wiem, jak masz na imię! Case Switching | 45 Pętle PHP posiada następujące słowa kluczowe dotyczące pętli: foreach, while, for oraz do...while. Pętla foreach została zaprojektowana do pracy z tablicami, a jej działanie polega na kolejnym przejściu przez każdy element w tablicy. Możesz jej również użyć z obiektami; w takim przy- padku przechodzi kolejno przez każdą publiczną zmienną tego obiektu. Najbardziej podstawowe użycie pętli foreach wyciąga jedynie wartości z każdego elementu tablicy, jak to zostało przedstawione poniżej: foreach($tablica as $wartosc) { print $wartosc; } W zaprezentowanym przykładzie tablica $tablica zostaje poddana działaniu pętli, a jej warto- ści zostają wyciągnięte do zmiennej $wartosc. W takiej sytuacji klucze tablicy są całkowicie ignorowane, co zwykle jest bardziej sensowne, jeśli zostają wygenerowane automatycznie (na przykład 0, 1, 2, 3 itd.). Oczywiście, pętli foreach możesz również użyć do wydobycia kluczy, na przykład w taki sposób: foreach($tablica as $klucz = $wartosc) { print $klucz = $wartosc ; } W trakcie pracy z obiektami składnia jest identyczna: ?php class monitor { private $Marka; public $Wielkosc; public $Rozdzielczosc; public $CzyJestPlaski; public function __construct($Marka, $Wielkosc, $Rozdzielczosc, $CzyJestPlaski) { $this- Marka = $Marka; $this- Wielkosc = $Wielkosc; $this- Rozdzielczosc = $Rozdzielczosc; $this- CzyJestPlaski = $CzyJestPlaski; } } $AppleCinema = new monitor( Apple , 30 , 2560x1600 , true); foreach($AppleCinema as $zmienna = $wartosc) { print $zmienna = $wartosc ; } ? Pętle PHP while są używane do wykonywania bloku kodu dopóty, dopóki warunek jest praw- dziwy. Na przykład poniższy kod wykona pętlę od 1 do 10, wyświetlając aktualną wartość: ?php $i = 1; while($i = 10) { print Liczba $i ; $i = $i + 1; } ? 46 | Rozdział 4. Język PHP Zwróć uwagę, że ponownie PHP używa bloków kodu przedstawiających zakres naszej pętli — pętle while rozpoczynają się znacznikiem otwierającym ({), a kończą znacznikiem zamy- kającym (}) — w celu wyraźnego „powiedzenia” PHP, które wiersze kodu powinny zostać uwzględnione w pętli. Podobnie jak w przypadku polecenia if, możesz umieścić jakiekolwiek wybrane przez siebie warunki w pętlach while. Istotną kwestią pozostaje zmiana wartości warunku po każdej pę- tli; w przeciwnym wypadku pętla będzie wykonywana w nieskończoność. Pętle while są najczęściej używane do zwiększenia o jednostkę listy, gdy nie ma ograniczenia dotyczącego liczby wykonań pętli. Na przykład: while(wciąż są wiersze do odczytania z bazy danych) { odczytaj wiersz; przejdź do kolejnego wiersza; } Bardziej rozpowszechnioną formą pętli jest pętla for, która jest nieco bardziej skomplikowana. Pętla for jest tworzona na podstawie deklaracji, warunku oraz akcji. Deklaracją jest zdefi- niowanie zmiennej — licznika pętli oraz ustawienie jej wartości początkowej. Warunkiem jest sprawdzenie zmiennej — licznika pętli w stosunku do wartości. Natomiast akcja to działanie, które powinno nastąpić po każdorazowej iteracji do zmiany licznika pętli. Poniżej znajduje się przykład pętli for w PHP: ?php for ($i = 1; $i 10; $i++) { print Liczba $i ; } ? Jak możesz zobaczyć, pętla for posiada trzy części oddzielone średnikami. W części deklaracyj- nej ustalamy zmienną $i, której przypisujemy wartość 1. W części zawierającej warunek wy- konujemy pętlę, jeżeli zmienna $i ma wartość mniejszą niż 10. Na końcu, jako akcję, wykonu- jemy dodawanie cyfry 1 do wartości zmiennej $i w trakcie każdego wykonania pętli. Dlatego też za każdym razem jest wykonywany kod pętli. Kiedy skrypt zostanie uruchomiony, będzie liczył od 1 do 10, wyświetlając przy tym aktual- ną liczbę. Zwróć uwagę, że w rzeczywistości nie zostanie wyświetlony tekst „Liczba 10”, po- nieważ określiliśmy, że zmienna $i musi być mniejsza od 10, nie zaś mniejsza bądź równa. Poniżej znajdują się dane wyjściowe omawianego skryptu: Liczba 1 Liczba 2 Liczba 3 Liczba 4 Liczba 5 Liczba 6 Liczba 7 Liczba 8 Liczba 9 Konstrukcja do...while jest w PHP podobna do pętli while. Różnicą jest to, że pętla do...while zostanie wykonana przynajmniej jeden raz. Spróbuj przeanalizować poniższy fragment kodu: ?php $i = 11; do { Pętle | 47 print Liczba $i ; } while ($i 10); ? Jeśli zostanie użyty powyższy kod, tekst „Liczba 11” zostanie wyświetlony przed porówna- niem zmiennej $i względem liczby 10. Jeżeli w trakcie sprawdzenia zmienna $i jest mniejsza od 10, wówczas pętla zostanie wykonana ponownie. Dla porównania, ten sam kod może zo- stać napisany przy użyciu pętli while: ?php $i = 11; while ($i 10) { print Liczba $i ; ? Różnica jest taka, że pętla while mogłaby nie przedstawić żadnych danych wyjściowych, po- nieważ sprawdza wartość zmiennej $i, zanim rozpocznie wykonywanie pętli. Dlatego też pętle do...while są zawsze wykonywane przynajmniej jeden raz. Nieskończone pętle Prawdopodobnie uznasz to za zaskakujące, ale nieskończone pętle mogą być często pomocne w Twoich skryptach. Jeżeli piszesz program, który pozwala użytkownikom na wpisywanie da- nych tak długo, jak oni zechcą, to nie będzie on działał, jeśli umieścisz skrypt w pętli wyko- nywanej 30000 razy lub nawet 30000000 razy. Zamiast tego kod powinien zostać zapętlony w nieskończoność, bezustannie przyjmując dane wprowadzane przez użytkownika, dopóki nie zakończy on programu poprzez naciśnięcie kombinacji Ctrl+C. Poniżej znajdują się dwa typy najczęstszych pętli działających w nieskończoność: ?php while(1) { print W pętli! ; } ? Ponieważ wartość „1” również przyjmuje wartość prawda, wykonywanie pętli będzie trwało w nieskończoność. ?php for (;;) { print W pętli! ; } ? W tym przykładzie, w pętli for brakuje części określających deklarację, warunek i akcję, co oznacza, że pętla będzie wykonywana w nieskończoność. Specjalne słowa kluczowe pętli PHP dostarcza Ci słów kluczowych break i continue, służących do kontrolowania operacji pętli. W jednym z poprzednich przykładów używaliśmy już polecenia break podczas omawia- nia poleceń switch/case. Wówczas break było wykorzystywane do wyjścia z bloku switch/ case, taki sam efekt polecenie wywołuje w pętli. Kiedy używamy go wewnątrz pętli do kie- 48 | Rozdział 4. Język PHP rowania zachowaniem pętli, polecenie break powoduje, że PHP opuszcza pętlę i kontynuuje działanie natychmiast po niej. Polecenie continue zmusza PHP do przeskoczenia pozostałej części bieżącej iteracji pętli i przejścia do kolejnej. Użytkownicy Perla powinni zwrócić uwagę na to, że polecenia break i continue są odpowiednikami poleceń last i next w Perlu. Na przykład: ?php for ($i = 1; $i 10; $i = $i + 1) { if ($i == 3) continue; if ($i == 7) break; print Liczba $i ; } ? Jest to zmodyfikowana wersja naszego oryginalnego skryptu dla pętli for. Tym razem dane wyjściowe przedstawiają się następująco: Liczba 1 Liczba 2 Liczba 4 Liczba 5 Liczba 6 Zauważ, że brakuje tekstu „Liczba 3”, a wykonywanie skryptu zostaje zakończone po wy- świetleniu „Liczba 6”. Kiedy bieżącą liczbą jest 3, polecenie continue zostaje użyte do przesko- czenia pozostałej części iteracji pętli i następuje przejście do „Liczba 4”. Podobnie jeżeli aktualną liczbą jest 7, wówczas polecenie break powoduje zakończenie działania pętli. Pętle wewnątrz pętli W PHP możesz zagnieżdżać pętle, na przykład w taki sposób: for ($i = 1; $i 3; $i = $i + 1) { for ($j = 1; $j 3; $j = $j + 1) { for ($k = 1; $k 3; $k = $k + 1) { print I: $i, J: $j, K: $k ; } } } Wynikiem działania powyższego kodu są następujące dane wyjściowe: I: 1, J: 1, K: 1 I: 1, J: 1, K: 2 I: 1, J: 2, K: 1 I: 1, J: 2, K: 2 I: 2, J: 1, K: 1 I: 2, J: 1, K: 2 I: 2, J: 2, K: 1 I: 2, J: 2, K: 2 W takiej sytuacji użycie polecenia break jest odrobinę bardziej skomplikowane, ponieważ spo- woduje ono wyjście jedynie z pętli zawierającej polecenie break. Na przykład: Pętle wewnątrz pętli | 49 for ($i = 1; $i 3; $i = $i + 1) { for ($j = 1; $j 3; $j = $j + 1) { for ($k = 1; $k 3; $k = $k + 1) { print I: $i, J: $j, K: $k ; break; } } } Tym razem skrypt wyświetli następujące dane wyjściowe: I: 1, J: 1, K: 1 I: 1, J: 2, K: 1 I: 2, J: 1, K: 1 I: 2, J: 2, K: 1 Jak możesz się przekonać, pętla $k zostanie wykonana tylko jeden raz z powodu wywołania polecenia break. Jednakże pozostałe pętle zostaną wykonane wiele razy. Możesz zyskać więcej kontroli przez podanie liczby po poleceniu break, na przykład break 2, co spowoduje prze- rwanie dwóch pętli bądź poleceń case/switch. Poniżej znajduje się przykład użycia polecenia break 2: for ($i = 1; $i 3; $i = $i + 1) { for ($j = 1; $j 3; $j = $j + 1) { for ($k = 1; $k 3; $k = $k + 1) { print I: $i, J: $j, K: $k ; break 2; } } } Wynik działania powyższego skryptu przedstawia się następująco: I: 1, J: 1, K: 1 I: 2, J: 1, K: 1 W powyższym skrypcie pętla została wykonana jedynie dwa razy, ponieważ pętla $k wywo- łała polecenie break 2, które przerwało wykonanie pętli $k oraz $j. Tak więc jedynie pętla $i została wykonana ponownie. Moglibyśmy użyć nawet polecenia break 3, co oznaczałoby przerwanie wszystkich trzech pętli i powrót do normalnej kontynuacji wykonywania kodu. Polecenie break ma zastosowanie zarówno w stosunku do pętli, jak i instrukcji switch/case. Na przykład: for ($i = 1; $i 3; $i = $i + 1) { for ($j = 1; $j 3; $j = $j + 1) { for ($k = 1; $k 3; $k = $k + 1) { switch($k) { case 1: print I: $i, J: $j, K: $k ; break 2; case 2: print I: $i, J: $j, K: $k ; break 3; } } } } Wiersz zawierający polecenie break 2; przerwie wykonywanie bloku kodu switch/case i pętli $k, podczas gdy wiersz z poleceniem break 3;, oprócz tych dwóch elementów, dodat- kowo przerwie wykonywanie pętli $j. Aby przerwać wszystkie pętle z wewnątrz konstrukcji switch/case, wymagane jest użycie polecenia break 4. 50 | Rozdział 4. Język PHP Przetwarzanie trybów mieszanych Kluczowa koncepcja w PHP daje możliwość włączenia trybu analizy składniowej PHP w do- wolnym miejscu oraz dowolną liczbę razy, nawet wewnątrz bloku kodu. Poniżej znajduje się podstawowy skrypt PHP: ?php if ($zalogowany == true) { print To jest miejsce na wiele różnych elementów ; print To jest miejsce na wiele różnych elementów ; print To jest miejsce na wiele różnych elementów ; print To jest miejsce na wiele różnych elementów ; print To jest miejsce na wiele różnych elementów ; } ? Jak możesz zobaczyć, skrypt zawiera wiele poleceń print, które zostaną wykonane jedynie wtedy, gdy zmienna $zalogowany przyjmie wartość true. Wszystkie dane wyjściowe zostały zahermetyzowane w poleceniach print, choć PHP pozwala na opuszczenie bloku kodu PHP, podczas gdy wciąż jest otwarty blok kodu polecenia if. Oto przykład, jak to się przedstawia w praktyce: ?php if ($zalogowany == true) { } To jest miejsce na wiele różnych elementów To jest miejsce na wiele różnych elementów To jest miejsce na wiele różnych elementów To jest miejsce na wiele różnych elementów To jest miejsce na wiele różnych elementów ?php } ? Wiersze zawierające tekst „To jest miejsce na wiele różnych elementów” są wciąż wysyłane jedynie wtedy, gdy zmienna $zalogowany przyjmuje wartość true. Wychodzimy jednak z try- bu PHP, aby je wyświetlić. Następnie ponownie wchodzimy do trybu PHP w celu zamknię- cia polecenia if i kontynuacji wykonywania kodu. Dzięki takiemu podejściu cały skrypt staje się łatwiejszy w czytaniu. Dołączanie innych plików Jedną z najczęstszych operacji w PHP jest włączanie jednego skryptu do drugiego i współdzie- lenie tym samym funkcjonalności. Do włączenia jednego skryptu do innego używamy słowa kluczowego include, podając nazwę pliku, który chcemy włączyć. Rozpatrzmy na przykład następujący plik — foo.php: ?php print Rozpoczynamy foo ; include bar.php ; print Kończymy foo ; ? A oto zawartość pliku bar.php: ?php print W barze ; ? Dołączanie innych plików | 51 PHP wczyta plik bar.php, odczyta jego zawartość, a następnie umieści ją w pliku foo.php w miej- scu wiersza include bar.php . Dlatego też plik foo.php będzie przedstawiał się następująco: ?php print Rozpoczynamy foo ; print W barze ; print Kończymy foo ; ? Być może dziwisz się, dlaczego został dodany jedynie wiersz zawierający tekst „W barze”, a pominięte wiersze zawierające znaczniki: otwierający i zamykający. Jest to spowodowane faktem, że PHP opuszcza tryb PHP za każdym razem, gdy dodaje inny plik, a następnie po „powrocie” z pliku ponownie przechodzi do trybu PHP. Dlatego też plik foo.php po połączeniu z plikiem bar.php w rzeczywistości wygląda następująco: ?php print Rozpoczynamy foo ; ? ?php print W barze ; ? ?php print Kończymy foo ; ? PHP dołącza plik jedynie wtedy, gdy wiersz zawierający polecenie include jest faktycznie wy- konywany. Zatem poniższy kod nigdy nie dołączy pliku bar.php: ?php if (53 99) { include bar.php ; } ? Jeżeli spróbujesz dołączyć plik, który nie istnieje, wówczas PHP wygeneruje komunikat ostrze- żenia. Jeśli Twój skrypt koniecznie wymaga określonego pliku, PHP posiada również słowo kluczowe require. W przypadku użycia require wywołanie nieistniejącego pliku spowoduje wystąpienie błędu krytycznego i tym samym zatrzymanie wykonywania skryptu. W sytuacji gdy dołączany do skryptu plik jest niezbędny, zazwyczaj najlepszym wyjściem jest skorzy- stanie z polecenia require. We wcześniejszych wersjach PHP polecenie require było odpowiednikiem bezwarun- kowego polecenia include. Jeżeli polecenie require zostało umieszczone wewnątrz instrukcji warunkowej, wówczas plik był dołączany, nawet jeśli wyrażenie warunkowe przyjmowało wartość false. Taka sytuacja nie ma miejsca w PHP5: pliki są dołączane jedynie wtedy, gdy wyrażenie warunkowe (jeśli takie istnieje) przyjmuje wartość true. Najczęstszym przykładem użycia dołączanych plików jest przechowywanie w nich powszech- nie używanych funkcji, definicji obiektów oraz kodu określającego układ programu. Jeżeli na przykład Twoja witryna używa tego samego nagłówka HTML na każdej stronie, wówczas każdą stronę możesz rozpocząć od poniższego wiersza: include header.php ; W ten sposób, jeśli będziesz chciał zmienić nagłówek swojej witryny, będziesz musiał prze- prowadzić jedynie edycję pliku header.php. Dwa dodatkowe słowa kluczowe, które prawdo- podobnie również będą używane, to include_once i require_once. Ich działanie odpowiada odpowiednio poleceniom include i require z tą różnicą, że plik będą dołączać tylko jeden 52 | Rozdział 4. Język PHP raz, nawet jeśli spróbujesz to zrobić wielokrotnie. Polecenia include_once i require_once współdzielą tę samą listę „dołączonych już” plików. Warto odnotować, że systemy operacyjne, które rozróżniają wielkość plików, na przykład Unix, są w stanie wielokrotnie użyć na pliku poleceń include_once/require_once, jeśli programista użył różnej wielkości liter w jego na- zwie. Na przykład: ?php include_once bar.php ; include_once BAR.php ; include_once Bar.php ; ? W systemie Unix powyższy kod spowoduje próbę dołączenia trzech różnych plików, ponie- waż Unix rozróżnia wielkość znaków. Rozwiązanie jest proste: w przypadku nazw plików na- leży zawsze używać małych liter. W komputerach z systemem Windows nazwy plików przeznaczonych do włączenia nie rozróżniają wielkości liter w PHP 5. Oznacza to, że dołą- czenie plików BAR.php i bar.php spowoduje włączenie tego samego pliku. Kiedy próbujesz dodać plik za pomocą polecenia include bądź require, PHP w pierwszej kolejności sprawdza katalog, z którego został uruchomiony skrypt. Jeżeli plik nie zostanie zna- leziony w tym katalogu, wówczas PHP sprawdza ogólną ścieżkę dostępu, która została zde- finiowana w Twoim pliku konfiguracyjnym php.ini przy użyciu dyrektywy include_path. Za każdym razem, gdy dołączasz plik za pomocą polecenia include lub require, PHP wymaga jego kompilacji. Jeżeli korzystasz z buforowania kodu, ten problem nie wy- stępuje. W przeciwnym przypadku PHP rzeczywiście wielokrotnie przeprowadza kompilację tego samego pliku. Z tego powodu, jeśli dołączasz różne pliki w tym sa- mym skrypcie, muszą one zostać przetworzone i skompilowane za każdym razem. Dlatego też najlepiej jest użyć funkcji include_once(). Jeżeli jej działanie zakończy się niepowodzeniem, spróbuj funkcji get_included_files() i get_required_files(), które informują Cię o nazwach dołączonych już plików. Wewnętrznie są one takimi samymi funkcjami, możesz więc użyć dowolnej. Funkcje Mimo że PHP jest dostarczane z licznymi funkcjami przeznaczonymi do wykonywania sze- rokiego zakresu zadań, być może zechcesz utworzyć swoje własne funkcje, gdy zajdzie taka konieczność. Jeśli zauważysz, że powtarzasz wykonywanie tych samych czynności lub będziesz chciał dzielić kod między poszczególnymi projektami, wówczas funkcje użytkownika są roz- wiązaniem dla Ciebie. Pisanie programów monolitycznych, w których wykonywanie kodu rozpoczyna się na począt- ku programu i jest kontynuowane bez przerwy do samego końca, jest z punktu widzenia ob- sługi kodu uznawane jako błędne. W takiej sytuacji nie możesz ponownie użyć kodu. Dzięki tworzeniu funkcji Twój kod jest znacznie krótszy, łatwy do kontrolowania i obsługi oraz mniej podatny na wystąpienie błędów. Prosta funkcja użytkownika Tworzonym przez siebie funkcjom możesz nadać dowolne nazwy; obowiązują tutaj te zasa- dy, jakie mamy w nazewnictwie zmiennych PHP (z wyjątkiem znaku $). Nie możesz ponow- nie definiować wbudowanych funkcji PHP oraz powinieneś zachować szczególną ostrożność Funkcje | 53 i upewnić się, że nazwy Twoich funkcji nie kolidują z istniejącymi funkcjami PHP. To, że Ty nie posiadasz dostępnej funkcji imagepng(), nie oznacza, że inni również jej nie posiadają. Najprostsza funkcja użytkownika może wyglądać jak na poniższym przykładzie: function foo() { return 1; } print foo(); Swoją funkcję definiujesz za pomocą słowa kluczowego function, a następnie nazwy funkcji oraz pary nawiasów. Rzeczywisty kod Twojej funkcji, który zostanie wykonany, znajduje się między nawiasami klamrowymi. W przypadku naszej funkcji foo() składa się z pojedynczego wiersza kodu return 1;, do którego wrócimy w dalszych wywodach. Po zdefiniowaniu funkcji możemy traktować foo() jak każdą inną funkcję. Przekonaliśmy się o tym w czwartym wierszu, w którym wyświetliliśmy zwracaną przez funkcję wartość (znaną jako wartości zwrotne). Wartości zwrotne Wolno zwracać jedną (i tylko jedną) wartość zwrotną z funkcji. Do tego celu jest wykorzy- stywane polecenie return. W naszym przykładzie moglibyśmy użyć „return foo ;” lub „return 10 + 10;” do przekazania wartości zwrotnych, ale return 1; jest najłatwiejszym i zwykle najczęstszym podobnie jak return true;. Możesz zwrócić dowolnie wybraną zmienną, tak długo jak będzie to po prostu jedna zmien- na dowolnego typu: liczba całkowita, łańcuch, połączenie z bazą danych itd. Słowo kluczowe return ustala wartość zwrotną funkcji jako zmienną, której możesz użyć, a następnie natych- miast wychodzi z funkcji. Możesz również użyć zapisu return; oznaczającego „wyjdź bez wysyłania z powrotem jakichkolwiek wartości”. Jeżeli spróbujesz przypisać zmiennej zwracaną wartość funkcji, która nie posiada zwracanej wartości (na przykład używa zapisu return; za- miast return $wartosc;), wówczas Twoja zmienna zostanie ustalona jako NULL. Przyjrzyj się poniższemu skryptowi: ?php function foo() { print W funkcji ; return 1; print Opuszczam funkcję... ; } print foo(); ? Uruchomienie powyższego skryptu spowoduje wyświetlenie komunikatu „W funkcji”, następ- nie „1”, po czym skrypt zakończy działanie. Powodem, dla którego nigdy nie zostanie wy- świetlony tekst „Opuszczam funkcję…”, jest fakt, że wiersz return 1; przekazuje wartość 1, a następnie natychmiast kończy działanie funkcji. Drugie polecenie print w funkcji foo() nig- dy nie zostanie osiągnięte. Jeżeli chcesz przekazać z powrotem więcej niż tylko jedną wartość, musisz skorzystać z tablicy. To zagadnienie zostanie opisane w rozdziale 5. 54 | Rozdział 4. Język PHP Często spotykaną sytuacją jest zwracanie wartości instrukcji warunkowej, na przykład: return $i 10; W powyższym poleceniu, jeśli zmienna $i będzie miała wartość większą od 10, operator zwróci 1, co jest identyczne z zapisem return 1;. Natomiast w przypadku gdy zmienna $i jest mniejsza lub równa 10, wówczas odpowiada to zapisowi return 0;. Parametry Projektowane przez Ciebie funkcje mogą korzystać z parametrów dzięki modyfikacji definicji funkcji pozwalającej na przyjęcie dowolnej liczby parametrów. Każdemu z parametrów możesz nadać nazwę, która będzie używana do odwołania się do parametru wewnątrz tej funkcji. Kiedy wywołasz później funkcję, PHP skopiuje wartości otrzymane dzięki tym parametrom, na przykład w taki sposób: ?php function mnozenie($liczba1, $liczba2) { $wynik = $liczba1 * $liczba2; return $wynik; } $moja_liczba = mnozenie(5, 10); ? Po uruchomieniu powyższego skryptu, zmienna $moja_liczba będzie miała ustawioną war- tość 50. Funkcja mnozenie() mogłaby zostać przepisana w taki sposób, aby zawierała po prostu jeden wiersz: return $liczba1 * liczba2. Przedstawiony przykład pokazuje, że możesz tworzyć swoje funkcje o dowolnej długości. Przekazywanie przez referencję Sprawy znacznie się komplikują, gdy dochodzimy do referencji, ponieważ musisz być w stanie zarówno przyjmować parametry przez referencję, jak i zwracać wartości przez referencję. Do tego celu wykorzystujemy operator referencji, którym jest znak . Oznaczenie parametru jako „przekazywanego przez referencję” następuje w definicji funkcji, a nie w wywołaniu funkcji. Dlatego też zapis: function mnozenie( $liczba1, $liczba2) { jest prawidłowy, podczas gdy zapis: $moja_liczba = mnozenie( 5, 10); jest błędny. To oznacza, że jeśli posiadasz wielokrotnie używaną funkcję w swoim projekcie, musisz przeprowadzić jedynie edycję definicji funkcji, aby pobierać zmienne przez referencję. Przekazywanie danych przez referencję jest często dobrym sposobem na skrócenie i uprosz- czenie czytania Twojego skryptu. Wybór rzadko jest powodowany przez czynniki związane z wydajnością. Rozpatrzmy poniższy kod: function kwadrat1($liczba) { return $liczba * $liczba; } $wartosc = kwadrat1($wartosc); function kwadrat2( $liczba) { Funkcje | 55 $liczba = $liczba * $liczba; } kwadrat2($wartosc); Pierwszy przykład przekazuje kopię zmiennej $wartosc, mnoży ją, a następnie zwraca wy- nik, który jest kopiowany z powrotem do zmiennej $wartosc. W przykładzie drugim zmien- na $wartosc zostaje przekazana przez referencję i zmodyfikowana bezpośrednio wewnątrz funkcji. Stąd zapis kwadrat2($wartosc) jest zupełnie wystarczający, zamiast kopiowania pierw- szego przykładu. Referencja jest odniesieniem do zmiennej. Jeżeli zdefiniowałeś funkcję, aby przyjmowała odwoła- nie do zmiennej, nie możesz przekazać do niej stałej. Oznacza to, że naszej definicji kwadrat2() nie możesz wywołać używając zapisu kwadrat2(10);. Liczba 10 nie jest zmienną, tak więc nie może zostać potraktowana referencyjnie. Zwracanie referencji W przeciwieństwie do przekazywania wartości przez referencję, co wymaga określenia refe- rencyjnej natury parametru w definicji funkcji, w przypadku zwrócenia referencyjnego musisz wskazać to w definicji oraz w trakcie wywołania. Aby określić, że funkcja powinna zwracać referencyjnie, musisz umieścić operator referencji przed nazwą funkcji. Niezbędne jest również określenie, że wynik funkcji również powinien być referencyjny, w przeciwieństwie do jego kopiowania używanego w normalnym przypisaniu, które zostało opisane wyżej. Poniżej znajduje się przykład takiej konstrukcji: function zwroc_rybe() { $ryba = Wanda ; return $ryba; } $ryba_ref = zwroc_rybe(); Parametry domyślne W trakcie projektowania swoich funkcji często pomocne jest przypisanie wartości domyślnych parametrom, które nie zostaną przekazane. PHP robi to w przypadku większości swoich funk- cji; przeważnie oszczędza Ci to podawania parametrów, które są zwykle takie same. W celu zdefiniowania swoich własnych wartości domyślnych dla parametrów funkcji, tuż za ustalaną zmienną, dodaj stałą wartość, która ma zostać przypisana, jeśli nie zostanie przekaza- ny odpowiedni parametr. Na przykład: function powitanie($imie = Paweł ) { return Witaj $imie! ; } powitanie(); powitanie( Paweł ) powitanie( Andrzej ); Uruchomienie powyższego skryptu spowoduje wyświetlenie: Witaj Paweł! Witaj Paweł! Witaj Andrzej! 56 | Rozdział 4. Język PHP Zastanów się nad następującą funkcją: function powitanie($imie, $nazwisko = Kowalski ) {} Nie oznacza to, że zarówno zmienna $imie, jak i $nazwisko powinny przyjąć wartość Kowalski. Zamiast tego jedynie zmienna $nazwisko pobiera tę wartość — PHP traktuje te dwie zmienne jako funkcjonalnie niezależne od siebie, co oznacza, że możesz użyć poniższego kodu: function powitanie($imie = Jan , $nazwisko = Kowalski ) { return Witaj, $imie $nazwisko! ; } Możesz więc użyć tego kodu do powitania trzech zacnych osób o nazwiskach: Jan Kowalski, Tomasz Dawidowski i Tomasz Kowalski: powitanie(); powitanie( Tomasz , Dawidowski ); powitanie( Tomasz ); Jeżeli chciałbyś powitać osobę o nazwisku Jan Wilczak, byłoby idealnie, gdybyś pozwolił PHP na przekazanie za Ciebie pierwszego parametru. Jan jest bowiem wartością domyślną w tej funkcji, a Ty dostarczysz tylko nazwiska Wilczak. Gdy jednak spróbujesz uruchomić poniższy kod, to stwierdzisz, że on nie działa: powitanie( Wilczak ); Zamiast otrzymać nazwisko Jan Wilczak, otrzymasz Wilczak Kowalski. Ponieważ PHP wypeł- nia parametry zaczynając od lewej strony, zostało przyjęte założenie, że przekazany przez Cie- bie parametr był imieniem. Ta sama logika wskazuje, że nie możesz umieścić wartości do- myślnej przed elementem nieposiadającym wartości domyślnej, na przykład w taki sposób: function powitanie($imie = Janek , $nazwisko) {} Jeżeli ktokolwiek użyłby funkcji w taki sposób: powitanie( Piotr ), powstałoby pytanie, czy wówczas nastąpiłaby próba dostarczenia wartości dla zmiennej $imie zamiast użycia jej warto- ści domyślnej? A może użytkownik chciałby użyć wartości domyślnej dla imienia, natomiast Piotr to wartość dla zmiennej $nazwisko? Na szczęście PHP zgłosi błąd, jeśli nastąpiłaby próba użycia kodu w taki sposób! Zliczanie parametrów zmiennej Przedstawiona w rozdziale 7. funkcja printf() posiada możliwość pobrania dowolnej liczby parametrów — może pobrać po prostu jeden parametr lub pięć lub pięćdziesiąt lub pięćset. Liczba elementów możliwych do pobrania jest dowolna, o ile zostaną przekazane przez użyt- kownika. Jest to znane pod nazwą lista parametrów zmiennej i będzie automatycznie imple- mentowane w funkcjach definiowanych przez użytkownika. Na przykład: function pewna_funkcja($a, $b) { $j = 1; } pewna_funkcja(1, 2, 3, 4, 5, 6, 7, 8); Przedstawiona powyżej funkcja pewna_funkcja() została tak zdefiniowana, aby pobierała je- dynie dwa parametry $a i $b. Możemy ją jednak wywołać z ośmioma parametrami, a skrypt powinien się uruchomić bez problemów. Istnieje jeden aspekt, w którym PHP różni się znacz- nie od języka C: w C Twoje funkcje muszą zostać użyte ściśle w stosunku do deklaracji ich pro- totypów. W przedstawionym powyżej przykładzie wartość 1 zostanie umieszczona w zmien- nej $a, a wartość 2 w zmiennej $b. Co się jednak stanie z pozostałymi parametrami? Funkcje | 57 Pomocne okażą się trzy funkcje: func_num_args(), func_get_arg() i func_get_args(), z któ- rych pierwsza i ostatnia nie pobierają parametrów. Aby pobrać liczbę parametrów, które zo- stały przekazane do Twojej funkcji, wywołaj funkcję func_num_args() i odczytaj jej wartość zwrotną. W celu pobrania wartości konkretnego parametru użyj funkcji func_get_arg() i prze- każ jej numer parametru, którego wartość chcesz otrzymać z powrotem. Na końcu funkcja func_get_args() zwraca tablicę przekazanych parametrów. Poniżej znajduje się przykład uży- cia tych funkcji: function pewna_funkcja($a, $b) { for ($i = 1; $i func_num_args(); ++$i) { $parametr = func_get_arg($i); echo Otrzymano parametr $parametr. ; } } function pewna_inna_funkcja($a, $b) { $parametr = func_get_args(); $parametr = join( , , $parametr); echo Otrzymano parametry: $parametr. ; } pewna_funkcja(1, 2, 3, 4, 5, 6, 7, 8); pewna_inna_funkcja(1, 2, 3, 4, 5, 6, 7, 8); Używając funkcji func_num_args() możesz łatwo zaimplementować sprawdzanie błędów funk- cji. Na przykład każdą swoją funkcję rozpocznij od upewnienia się, że funkcja func_num_args() zawiera oczekiwane przez Ciebie elementy, a jeśli tak nie jest, zakończ działanie funkcji. Kiedy jednak dodasz już func_num_arg(), powinieneś łatwo tworzyć swoje własne funkcje, które będą funkcjonowały z dowolną liczbą parametrów. Zasięg zmiennej w funkcjach Zmienne zdeklarowane na zewnątrz funkcji i klas są nazywane globalnymi, co oznacza, że są ogólnie dostępne w każdym miejscu skryptu. Ponieważ jednak funkcje są niezależnymi blo- kami, ich zmienne są niezależne i nie mają wpływu na zmienne w głównym skrypcie. W ten sam sposób zmienne z głównego skryptu nie są bezwarunkowo dostępne wewnątrz funkcji. Spójrz na poniższy przykład: function foo() { $bar = wombat1 ; } $bar = baz ; foo(); print $bar; Wykonanie powyższego skryptu rozpocznie się w wierszu $bar = baz , a następnie nastąpi wywołanie funkcji foo(). W tym momencie, jak możesz zobaczyć, funkcja foo() ustawi zmien- nej $bar wartość wombat, po czym zwróci kontrolę do głównego skry
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

PHP. Almanach
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: