You are on page 1of 31

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE

PHP. Almanach
Autor: Paul Hudson
Tumaczenie: Robert Grczyski
ISBN: 83-246-0348-4
Tytu oryginau: PHP in a Nutshell
Format: B5, stron: 384

ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

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

Jzyk PHP zyska ju liczne grono zadowolonych uytkownikw. Jest wykorzystywany


w witrynach internetowych do obsugi formularzy, wywietlania treci z bazy danych
i do wielu innych zada. Co przysporzyo mu tak wielkiej popularnoci? Prosta skadnia,
wielkie moliwoci i doskonaa dokumentacja dostpna w sieci? Na pewno tak, ale
jedn z jego najwikszych zalet jest bezpatna dystrybucja. Najnowsza wersja PHP,
oznaczona numerem 5, to w peni obiektowy jzyk programowania pozwalajcy na
korzystanie z niemal wszystkich nowoczesnych internetowych rozwiza
technologicznych jzyka XML, usug sieciowych czy protokou SOAP.
Ksika PHP. Almanach to kompletny przewodnik po najnowszej wersji tego jzyka.
Znajduj si w niej informacje na temat programowania obiektowego, tworzenia
elementw dynamicznych witryn WWW i zabezpieczania aplikacji przed dostpem
osb niepowoanych. Zamieszczono tu rwnie opisy kilku najpopularniejszych
rozszerze jzyka PHP, ktre mog okaza si bardzo przydatne przy tworzeniu
aplikacji internetowych.
W ksice omwiona midzy innymi:
Instalacja PHP w Windows i Linuksie
Podstawowe elementy jzyka PHP
Programowanie obiektowe
Obsuga formularzy na stronach WWW
Zarzdzanie sesjami i plikami cookie
Buforowanie danych wyjciowych
Operacje na plikach i bazach danych
Generowanie grafiki, plikw PDF i SWF
Obsuga plikw XML
Dystrybucja aplikacji
Testowanie i usuwanie bdw
Optymalizacja kodu
To obowizkowa lektura kadego programisty PHP

Wprowadzenie ............................................................................................................... 9
1. Wprowadzenie do PHP ..................................................................................................13
Historia PHP
Zalety PHP
Uzyskiwanie pomocy
Uzyskanie certyfikatu
rda wiedzy o PHP

13
14
16
20
20

2. Instalacja PHP ................................................................................................................ 23


Instalacja w systemie Windows
Instalacja w systemie Unix
Testowanie swojej konfiguracji
Konfiguracja systemu

23
26
29
30

3. Interpreter PHP ..............................................................................................................31


Uruchamianie skryptw PHP
Rozszerzanie PHP
PEAR
Nieprawidowe przerwanie wykonywania skryptu

31
32
33
34

4. Jzyk PHP ....................................................................................................................... 37


Podstawy PHP
Zmienne
Wolne przestrzenie
Heredoc
Krtkie wprowadzenie do typw zmiennych
Bloki kodu
Otwarcie i zamknicie blokw kodu
Komentarze

37
38
40
40
41
41
41
42

Instrukcje warunkowe
Case Switching
Ptle
Nieskoczone ptle
Specjalne sowa kluczowe ptli
Ptle wewntrz ptli
Przetwarzanie trybw mieszanych
Doczanie innych plikw
Funkcje

42
44
46
48
48
49
51
51
53

5. Zmienne i stae .............................................................................................................. 61


Typy danych
Warto true lub false
acuchy
Liczby cakowite
Liczby zmiennoprzecinkowe
Automatyczna konwersja typu
Sprawdzenie, czy zmienna jest ustalona: isset()
Zasig zmiennej
Zmienne zmiennych
Tablice superglobalne
Uywanie $_ENV oraz $_SERVER
Odniesienia
Stae
Tablice

61
62
62
63
64
65
66
67
67
68
70
71
72
75

6. Operatory ...................................................................................................................... 93
Operatory arytmetyczne
Operatory przypisania
Operatory acuchw
Operatory poziomu bitowego
Operatory porwnania
Operatory zwikszenia i zmniejszenia o jednostk
Operatory logiczne
Kilka przykadw operatorw
Operator trjkowy
Operator wykonania
Operator pierwszestwa i asocjacyjny

93
94
94
95
96
97
98
99
100
100
101

7. Encyklopedia funkcji ................................................................................................... 103


Nieudokumentowane funkcje
Obsuga znakw nieangielskich
4

Spis treci

104
104

8. PHP zorientowany obiektowo ................................................................................... 145


Oglny opis pojcia
Klasy
Obiekty
Waciwoci
Zmienna 'this'
Obiekty wewntrz obiektw
Modyfikatory kontroli dostpu
Informacja o typie obiektu
Wskazwki dotyczce typu klasy
Konstruktory i destruktory
Kopiowanie obiektw
Porwnywanie obiektw za pomoc == i ===
Zapisywanie obiektw
Magiczne metody
Statyczne metody i waciwoci klas
Przydatne funkcje pomocnicze
Interfejsy
Dereferencja wartoci zwrotnych obiektu

145
146
148
149
150
150
151
157
158
159
162
163
164
165
168
169
170
172

9. Formularze HTML ........................................................................................................173


Co oznacza by dynamicznym?
Projektowanie formularza
Obsuga danych
Rozdzielenie formularza na wiele stron
Sprawdzanie poprawnoci danych wejciowych
Projektowanie formularza
Podsumowanie

174
174
178
182
183
185
186

10. Cookies i sesje ..............................................................................................................187


Cookies kontra sesje
Uywanie cookies
Uywanie sesji
Przechowywanie zoonych typw danych

187
188
190
196

11. Buforowanie danych wyjciowych .............................................................................197


Dlaczego uywa buforowania danych wyjciowych?
Rozpoczynamy
Ponowne uywanie buforw
Bufory kaskadowe
Oprnianie buforw kaskadowych
Odczytywanie buforw

197
198
198
199
199
200
Spis treci

Inne funkcje OB
Oprnianie danych wyjciowych
Kompresja danych wyjciowych
Przepisywanie URL

201
201
203
204

12. Bezpieczestwo .......................................................................................................... 207


Podpowiedzi dotyczce bezpieczestwa
Szyfrowanie

207
209

13. Pliki .............................................................................................................................. 213


Odczytywanie plikw
Tworzenie i zmiana plikw
Przenoszenie, kopiowanie i usuwanie plikw
Inne funkcje dotyczce plikw
Sprawdzenie, czy plik istnieje
Otrzymywanie informacji dotyczcych czasu pliku
Szczegowa analiza informacji w nazwie pliku
Obsuga przekazywania plikw na serwer
Blokowanie plikw za pomoc funkcji flock()
Odczytywanie praw dostpu pliku i jego statusu
Zmiana prawa dostpu i wasnoci pliku
Praca z dowizaniami
Praca z katalogami
Zdalne pliki
Sumy kontrolne plikw
Przetwarzanie pliku konfiguracyjnego

213
217
219
220
221
222
222
223
225
226
227
228
229
231
231
231

14. Bazy danych ................................................................................................................ 235


Uywanie MySQL z PHP
PEAR::DB
SQLite
Stae poczenia
Udoskonalony MySQL

235
242
247
251
252

15. Wyraenia regularne .................................................................................................. 253


Podstawy regexps: preg_match() i preg_match_all()
Klasy znakw regexps
Znaki specjalne wyrae regularnych
Sowa i wolne przestrzenie wyrae regularnych
Przechowywanie dopasowanych acuchw
Zastpowanie wyraeniami regularnymi
Przykady skadni wyrae regularnych
Program Regex Coach
6

Spis treci

253
254
254
258
258
259
260
261

16. Operacje na obrazkach ............................................................................................... 263


Rozpoczynamy
Wybr formatu
Rozpoczynamy tworzenie
Wicej ksztatw
Zoone ksztaty
Wywietlanie tekstu
Wczytywanie istniejcych obrazkw
Kolor i wypenianie obrazka
Dodanie przezroczystoci
Uywanie pdzli
Podstawy kopiowania obrazkw
Skalowanie i rotacja
Punkty i linie
Efekty specjalne uzyskane za pomoc funkcji imagefilter()
Przeplot obrazka
Pobieranie typu MIME obrazka

263
265
266
267
269
270
273
275
277
278
280
282
285
287
290
290

17. Tworzenie plikw PDF ................................................................................................ 293


Rozpoczynamy
Dodanie wikszej liczby stron oraz dodatkowych stylw
Dodanie obrazkw
Efekty specjalne PDF
Doczenie danych dokumentu

293
295
296
297
297

18. Tworzenie klipw Flash .............................................................................................299


Prosty klip
Tekst w klipach Flash
Akcje
Animacja

299
301
302
304

19. XML & XSLT ................................................................................................................. 307


Rozszerzenie SimpleXML
Transformacja XML za pomoc XSLT

307
313

20. Programowanie sieciowe ........................................................................................... 315


Gniazda
HTTP
Wysyanie wiadomoci e-mail
Curl

315
318
322
329

Spis treci

21. Rozprowadzanie swojego kodu ................................................................................ 337


Kod niezaleny od platformy 1: wczytywanie rozszerze
Kod niezaleny od platformy 2: uywanie rozszerze
Kod niezaleny od platformy 3: cieki i separatory wierszy
Kod niezaleny od platformy 4: rnice w pliku php.ini
Kod niezaleny od platformy 5: sprawdzanie wersji PHP
za pomoc funkcji phpversion() i version_compare()

337
338
338
339
340

22. Debugowanie .............................................................................................................. 341


Najbardziej podstawowa technika debugowania
Tworzenie warunkw
Zgaszanie swoich bdw
Testowanie za pomoc funkcji php_check_syntax()
Kolorowanie kodu rdowego
Obsuga bdw MySQL
Obsuga wyjtkw
Wsteczne przegldanie swojego kodu
Wasna obsuga bdw
Wasna obsuga wyjtkw
Uycie symbolu @ do zablokowania bdw
Funkcja phpinfo()
Styl danych wyjciowych

341
342
344
345
345
346
347
350
351
354
354
355
355

23. Wydajno ...................................................................................................................359


Rozsdnie napisz swj kod
Uycie Zend Optimizer
Uycie bufora kodu PHP
Kompresja danych wyjciowych
Nie uywaj CGI
Przeprowad debugowanie swojego kodu
Uywaj staych pocze
Prawidowa kompilacja

359
360
360
360
361
361
361
362

Skorowidz ...................................................................................................................363

Spis treci

ROZDZIA 4.

Niniejszy rozdzia stanowi kompletne wprowadzenie do podstaw programowania PHP; przedstawia zmienne, komentarze, instrukcje warunkowe, ptle oraz inne konstrukcje. Jeeli posiadasz niewielkie dowiadczenie w PHP, najlepiej rozpocz prac wanie od lektury tego
rozdziau. W przeciwnym przypadku moesz zapozna si z poszczeglnymi jego fragmentami w celu odwieenia pamici.

Podstawy PHP
PHP dziaa domylnie z wyczonym trybem PHP, co oznacza, e dopki tryb PHP nie zostanie wczony, zawarto bdzie traktowana jako zwyky tekst, a nie jako kod PHP. Taka
metoda analizy powoduje, e elementy skryptu PHP s blokami kodu samodzielnymi
fragmentami kodu, ktre mog dziaa niezalenie od otaczajcego je kodu HTML.
W celu oznaczenia typu skryptw PHP s one zwykle zapisywane z rozszerzeniem .php. Ilekro Twj serwer WWW zostanie poproszony o wysanie pliku koczcego si na .php, wwczas w pierwszej kolejnoci przekae plik do interpretera PHP. Z kolei interpreter wykona kod
zawarty w skrypcie, a nastpnie zwrci uytkownikowi wygenerowany plik. Podstawowa
jednostka kodu PHP jest nazwana poleceniem i koczy si znakiem rednika oznaczajcym
zakoczenie polecenia. W celu zachowania przejrzystoci jeden wiersz kodu zazwyczaj zawiera jedno polecenie, cho moesz umieci w nim tyle polece, ile tylko zechcesz. Ponisze
dwa przykady wykonuj to samo zadanie:
<?php
// opcja 1
print "Witaj, ";
print "wiecie!";
// opcja 2
print "Witaj, "; print "wiecie!";
?>

Puryci PHP wskazuj, e technicznie rzecz biorc print nie jest funkcj i z tego punktu widzenia maj racj. Dlatego te polecenie print nie wymaga nawiasw klamrowych wok przekazywanych do niego danych. Do innych konstrukcji jzyka, ktre maskuj si jako funkcje
(i wspominamy tutaj o nich ze wzgldu na zachowanie porzdku), nale polecenia: array,
echo, include, require, return i exit.

37

Moesz uy nawiasw z tymi konstrukcjami; jest to zupenie nieszkodliwe:


<?php
print("Witaj!");
?>

Chocia na pierwszy rzut oka polecenia print i echo wydaj si identyczne, to jednak nie s.
W przeciwiestwie do polecenia echo, konstrukcja print zachowuje si bardziej jako funkcja,
poniewa zwraca warto (1). Jednake polecenie echo jest bardziej uyteczne, gdy moesz do
niego przekaza wiele parametrw, na przykad w ten sposb:
<?php
echo "To ", "jest ", "test.";
?>

Aby uzyska taki sam efekt za pomoc konstrukcji print, zamiast znaku przecinka musiaby
uy operatora poczenia (.) i poczy ze sob acuchy. Jeeli, podobnie jak w powyszym
przykadzie, posiadasz kilka elementw do wywietlenia, wwczas ze wzgldu na zachowanie
przejrzystoci zalecane jest uycie polecenia echo.

Zmienne
Zmienne w PHP czyli elementy, ktre przechowuj dane rozpoczynaj si znakiem $,
nastpnie wystpuje znak podkrelenia lub litera, a dalej kombinacja liter, cyfr i znakw podkrelenia. Oznacza to, e nie moesz rozpocz nazwy zmiennej od cyfry. Jednym godnym
uwagi wyjtkiem w oglnym schemacie nazewnictwa zmiennych s zmienne zmiennych,
ktre zostan przedstawione w kolejnym rozdziale. Lista poprawnych i niepoprawnych nazw
zmiennych zostaa przedstawiona w tabeli 4.1.
Tabela 4.1. Poprawne i niepoprawne nazwy zmiennych
$mojazmienna

Poprawna nazwa.

$Imie

Poprawna nazwa.

$_Wiek

Poprawna nazwa.

$___WIEK___

Poprawna nazwa.

$91

Niepoprawna nazwa, rozpoczyna si cyfr.

$1Imie

Niepoprawna nazwa, rozpoczyna si cyfr.

$Imie91

Poprawna nazwa, cyfry s poprawne, jeli s na kocu i po pierwszym znaku.

$_Imie91

Poprawna nazwa.

$Imie's

Niepoprawna nazwa, nie s dozwolone inne symbole ni _, a wic apostrof jest niedozwolony.

Zmienne rozrniaj wielko liter, co oznacza, e zmienna $Foo nie jest t sam zmienn co:
$foo, $FOO lub $fOO.
Przypisywanie zmiennych jest tak proste jak uywanie na zmiennej operatora przypisania (=),
a nastpnie podanie wartoci, ktra ma zosta przypisana. Poniej znajduje si prosty skrypt
przedstawiajcy przypisanie oraz dane wyjciowe. Zwr uwag na znaki rednika uyte na
kocu kadego polecenia:

38

Rozdzia 4. Jzyk PHP

<?php
$imie = "Pawe";
print "Twoje imi to $imie\n";
$imie2 = $imie;
$wiek = 20;
print "Twoje imi to $imie2, a Twj wiek to $wiek lat\n";
print 'Do widzenia, $imie!\n';
?>

W powyszym przykadzie zmiennej $imie przypisalimy acuch Pawe, a PHP pozwoli


nam wywietli t zmienn po fragmencie Twoje imi to. Poniewa PHP w kadym znalezionym przez siebie miejscu (lub wewntrz acuchw ujtych w podwjny znak cudzysowu,
to znaczy rozpoczynajce si i koczce na ") wystpienia zmiennej $imie zastpi zmienn
jej wartoci, dane wyjciowe z pierwszego polecenia to Twoje imi to Pawe.
Nastpnie ustawiamy zmienn $imie2, aby bya zmienn $imie, co powoduje skopiowanie
wartoci zmiennej $imie do zmiennej $imie2. Po tej operacji zmienna $imie2 ma warto Pawe.
Ustawiamy rwnie zmienn $wiek i przypisujemy jej warto 20. Nasze drugie polecenie print
wywietla jednoczenie obie zmienne. I tym razem PHP zastpuje zmienne ich rzeczywistymi
wartociami.
Jednake ostatnie polecenie print nie zastpi zmiennej $imie wartoci Pawe. Zamiast tego
zostanie wywietlone:
Do widzenia, $imie!\n

Powodem takiego stanu rzeczy jest fakt, e PHP nie wykonuje zastpienia zmiennej wewntrz
acuchw ujtych w znaki pojedynczego cudzysowu oraz nie zastpuje wikszoci znakw
sterujcych (wyjtkiem jest \'). W acuchach ujtych w podwjne znaki cudzysowu PHP
zastpi zmienn $imie jej wartoci, natomiast w acuchu ujtym w pojedyncze znaki cudzysowu PHP interpretuje, e chcesz otrzyma tekst $imie jako dane wyjciowe.
Kiedy chcesz doda cokolwiek do swojej zmiennej wewntrz acucha, PHP moe uzna te
znaki za cz zmiennej. Na przykad:
<?php
$owoc = "grejpfrut";
print "Te $owocy nie s jeszcze dojrzae.";
?>

Podczas gdy podanymi danymi wyjciowymi byo zdanie Te grejpfruty nie s jeszcze dojrzae., to jednak rzeczywiste dane wyjciowe s inne. Poniewa dodalimy znak y na kocu
nazwy zmiennej, zmienilimy j z $owoc na $owocy. Zmienna $owocy nie istnieje, wic PHP
pozostawi puste miejsce i moe wygenerowa bd. S dwa sposoby rozwizania tego typu
sytuacji:
<?php
$owoc = "grejpfrut";
print "Te ${owoc}y nie s jeszcze dojrzae.";
print "Te {$owoc}y nie s jeszcze dojrzae.";
?>

Nawiasy { i } uywane wewntrz acucha technicznie oznaczaj zmienn zmiennej, ale w przykadzie przedstawionym powyej informuj PHP, w ktrym miejscu nastpuje koniec zmiennej. Nie musisz uywa nawiasw wwczas, gdy dodawane do zmiennej znaki powoduj, e
nazwa zmiennej staje si niepoprawna, na przykad w poniszej sytuacji:

Zmienne

39

<?php
$owoc = "grejpfrut";
print "Smak tego $owoc'u nie jest dobry.";
?>

Taki zapis bdzie funkcjonowa, poniewa nie wolno uywa apostrofw jako czci nazwy
zmiennej.

Wolne przestrzenie
Znaki odstpu, tabulatory i puste wiersze midzy poleceniami nie maj wpywu na sposb
wykonywania kodu. Dla PHP nastpny przedstawiony skrypt jest traktowany jak kady inny,
niezalenie od faktu, e niektre polecenia s w tym samym wierszu, a inne zostay rozbite
na kilka wierszy:
<?php
$imie = "Pawe"; print "Twoje imi to $imie\n";
$imie2 = $imie; $wiek = 20;
print "Twoje imi to $imie2, a Twj wiek to $wiek lat\n";
print 'Do widzenia, $imie!\n';
?>

Naley uywa wolnych przestrzeni do rozdzielenia Twojego kodu na czytelne bloki, tak aby
ich znaczenie byo atwe do zrozumienia dziki wizualnemu przedstawieniu rozmieszczenia.

Heredoc
Jeeli posiadasz dugi acuch, moesz rozway uycie skadni heredoc. W zasadzie heredoc
pozwala Ci na zdefiniowanie wasnych ogranicznikw acucha, tak wic moesz uy innych znakw ni pojedynczy lub podwjny cudzysw. Na przykad moemy uy acucha EOT (end of text koniec tekstu) jako naszego ogranicznika. Dziki temu pozbywamy si
z gwnej czci tekstu znakw pojedynczego i podwjnego cudzysowu acuch zostanie
zakoczony jedynie po wpisaniu EOT.
Wydaje si to troch bardziej skomplikowanie ni jest w praktyce. Ogranicznik acucha musi
by jedynym elementem od samego pocztku wiersza. Oznacza to, e nie moesz doda wok niego znakw odstpu bd tabulatorw. Poniej jest przedstawiony dziaajcy przykad
tego typu skadni:
<?php
$mojlancuch = <<<EOT
To jest pewien tekst PHP.
Tekst jest cakowicie dowolny.
Mog w nim uy znakw "podwjny cudzysw"
oraz 'pojedynczy cudzysw',
a nawet $zmiennych, ktre zostan prawidowo
zamienione na ich wartoci.
Moesz nawet wpisa acuch EOT, tak dugo jak nie bdzie on
jedynym acuchem w wierszu, jak ma to miejsce poniej:
EOT;
?>

40

Rozdzia 4. Jzyk PHP

Naley zwrci uwag na kilka wanych informacji o heredoc oraz powyszym przykadzie:
Moesz uy dowolnych znakw jako ogranicznika acucha, EOT jest tylko przykadem.
Przed ogranicznikiem musisz uy zapisu <<< w celu poinformowania PHP, e chcesz

wej do trybu heredoc.


Wczone jest zastpowanie zmiennych, co oznacza, e musisz zmieni znaczenie znaku

dolara, jeli nie chcesz, aby PHP zastpio zmienn jej wartoci.
Moesz uy ogranicznika w dowolnym miejscu w tekcie, z wyjtkiem pierwszej kolumny

nowego wiersza.
Na kocu acucha wpisz ogranicznik bez otaczajcych go wolnych przestrzeni, a nastp-

nie dodaj znak rednika.


Bez skadni heredoc skomplikowane przypisania acuchw mogyby by bardzo zawie.

Krtkie wprowadzenie do typw zmiennych


Zmienne w PHP mog by typu: cakowitego (liczby cakowite), zmiennoprzecinkowego (zwykle nazywane float; s to liczby zmiennoprzecinkowe), acuch (zestaw znakw), tablica
(grupa danych), obiekt (kompleksowe poczenie danych i funkcjonalnoci) lub zasb (jakiekolwiek zewntrzne dane, na przykad obrazek). Poszczeglne typy poznamy bardziej szczegowo w dalszej czci ksiki. W chwili obecnej musimy jedynie wiedzie, czym s zmienne
i jak one dziaaj.

Bloki kodu
PHP do intensywnie korzysta z blokw kodu porcji kodu PHP, ktry jest oddzielony od
pozostaej czci skryptu. W trakcie czytania dalszych podrozdziaw tego rozdziau zauwaysz, e PHP uywa nawiasw klamrowych { i } do otwarcia i zamknicia blokw kodu.

Otwarcie i zamknicie blokw kodu


Istnieje wiele sposobw na otwarcie bloku kodu PHP (przejcie do trybu analizy skadniowej
PHP); wybierz ten, ktry odpowiada Ci najbardziej. Zalecanym sposobem jest uycie znacznika
<?php w celu wejcia do trybu PHP oraz ?> do opuszczenia trybu PHP, cho moesz rwnie
skorzysta ze skrconych wersji znacznikw, <? i ?>.
Skrcony zapis ma jedn du zalet oraz dwie powane wady: moesz otrzyma dane wyjciowe ze swojego skryptu dziki uyciu specjalnego zapisu <?=, jak ma to miejsce w poniszym
przykadzie:
<?="Witaj, wiecie!" ?>

Poniej znajduje si odpowiednik przedstawionego wyej skryptu, tym razem napisany przy
uyciu standardowych otwierajcych i zamykajcych znacznikw PHP:
<?php
print "Witaj, wiecie!";
?>

Otwarcie i zamknicie blokw kodu

41

Skrcona wersja znacznikw jest zatem bardziej zwiza, ale troch trudniejsza do czytania.
Jednake pierwsz wad skrconego zapisu znacznikw PHP jest fakt, e nakadaj si z XML
(i przez to take z XHTML), ktre rwnie uywaj zapisu <? do otwarcia bloku kodu. Oczywicie, oznacza to, e jeli bdziesz prbowa uy razem XML oraz skrconych znacznikw
PHP, wwczas napotkasz problemy. Mamy wic pierwszy powd, dla ktrego zaleca si uywanie standardowych otwierajcych i zamykajcych znacznikw PHP. Skrcone znaczniki s
zawsze niebezpieczne, poniewa mog zosta zablokowane w pliku konfiguracyjnym PHP,
php.ini. Prowadzi to do tego, e Twoje skrypty nie bd przenone.
Istniej rwnie dwa inne, rzadziej uywane warianty. Pierwszy z nich, <% %>, otwiera i zamyka blok kodu w taki sam sposb, w jaki robi to Microsoft ASP. Drugim zapisem jest <script
language="php"></script>. Te dwa warianty czsto sprawuj si lepiej w graficznych edytorach WWW, takich jak Macromedia Dreamweaver lub Microsoft FrontPage. Nie s jednak zalecane do oglnego uycia, poniewa musz zosta wczone, aby mogy funkcjonowa prawidowo.
Moesz przej do trybu PHP oraz z niego wyj uywajc znacznikw <?php i ?> gdziekolwiek i jak czsto zechcesz.

Komentarze
Znajdujc si w trybie PHP moesz zaznaczy okrelone czci kodu jako komentarz, a te fragmenty nie powinny zosta wykonane. Mamy trzy sposoby oznaczenia tekstu jako komentarz:
//, /* */ oraz #. Zapisy // i # oznaczaj: Zignoruj pozosta cz wiersza, podczas gdy zapis /* oznacza: Zignoruj wszystko, dopki nie natkniesz si na */. W trakcie stosowania zapisu
/* */ wystpuj pewne komplikacje, co powoduje, e ten sposb jest mniej podany w uyciu.
<?php
print "To zostanie wywietlone\n";
// print "To nie zostanie wywietlone\n";
# print "To nie zostanie wywietlone\n";
print "To zostanie wywietlone\n";
/* print "To nie zostanie wywietlone\n";
print "To nie zostanie wywietlone\n"; */
?>

Powyszy fragment kodu przedstawia w dziaaniu wszystkie trzy typu komentarzy, ale nie
pokazuje problemu zwizanego ze stylem komentowania /* */. Jeeli rozpocze zapisem /*
komentarz w jednym wierszu, a zakoczye go znacznie niej, gdzie rozpocz si inny komentarz stylu /*, wwczas stwierdzisz, e skrypt nie dziaa. Jest to spowodowane faktem, e
nie moesz gromadzi lub zagnieda komentarzy stylu /* */. Prba takiego dziaania zakoczy si spektakularnym niepowodzeniem.
Najlepszym wyjciem w celu komentowania jest zastosowanie komentarzy typu //, poniewa
s one proste, atwe do zlokalizowania, odczytania i kontrolowania.

Instrukcje warunkowe
PHP pozwala na wybr podejmowanej akcji, w zalenoci od wynikw spenienia warunku.
Warunek moe zosta dowolnie przez Ciebie wybrany; dysponujesz rwnie moliwoci -

42

Rozdzia 4. Jzyk PHP

czenia warunkw, co pozwala na tworzenie bardziej skomplikowanych akcji. Poniej znajduje


si dziaajcy przykad:
<?php
$Wiek = 20;
if ($Wiek < 18) {
print "Jeste zbyt mody - baw si dobrze!\n";
} else {
print "Nie masz poniej 18 lat.\n";
}
if ($Wiek >= 18 && $Wiek < 50) {
print "Jeste w najlepszym okresie swojego ycia!\n";
} else {
print "Nie jeste w najlepszym okresie swojego ycia.\n";
}
if ($Wiek >= 50) {
print "Bdziesz mg wkrtce odpocz - hurra!\n";
} else {
print "Nie bdziesz mg wkrtce odpocz :-( ";
}
?>

Na najbardziej podstawowym poziomie PHP ocenia polecenie if od lewej do prawej strony,


co oznacza, e w pierwszej kolejnoci jest sprawdzane, czy zmienna $Wiek jest rwna bd
wiksza od 18. Dopiero w dalszej kolejnoci nastpuje sprawdzenie, czy zmienna $Wiek
jest mniejsza od 50. Podwjny znak && oznacza, e oba wyraenia musz przyj warto
true, aby zosta wykonany fragment kodu print "Jeste w najlepszym okresie swojego
ycia\n". Jeeli z jakiegokolwiek powodu jeden z warunkw nie przyjmuje wartoci true,
wwczas zostanie wywietlone zdanie: Nie jeste w najlepszym okresie swojego ycia. Kolejno, w ktrej s sprawdzane warunki, jest uzaleniona od pierwszestwa operatora. Zagadnienia zwizane z pierwszestwem operatorw zostan omwione w nastpnym rozdziale.
Oprcz operatora && wystpuje rwnie operator || (podwjna pionowa linia), ktry oznacza OR (lub). W takiej sytuacji cae wyraenie przyjmuje warto true, jeeli jeden z warunkw
przyjmie warto true.
Mamy kilka sposobw na porwnanie dwch liczb. Do tej pory poznalimy < (mniejszy ni),
<= (mniejszy bd rwny) i >= (wikszy bd rwny). Pen list zaprezentujemy dalej, ale
w pierwszej kolejnoci naley wspomnie o jednym wanym operatorze: == (dwa znaki rwnoci obok siebie). Oznaczaj one jest rwny. 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
wasnym bloku kodu (pamitaj, blok kodu rozpoczyna si nawiasem klamrowym {, a koczy
nawiasem klamrowym }). Natomiast kod przeznaczony do wykonania w przypadku, gdy warunek nie zostanie speniony, znajduje si w bloku else. Dziki takiemu ukadowi PHP nie
bdzie prbowa wykona kodu zarwno wtedy, gdy wyraenie przyjmuje zarwno warto
true, jak i false.
Jedn kwesti wart odnotowania jest fakt, e PHP praktykuje jak najkrtsze polecenie if
bdzie prbowa wykona minimaln dopuszczaln liczb warunkw. W zasadzie przestanie sprawdza warunki, gdy tylko upewni si, e moe to zrobi. Na przykad:
if ($Wiek > 10 && $Wiek < 20)

Instrukcje warunkowe

43

Jeeli zmienna $Wiek przyjmie warto 8, wwczas pierwszy warunek ($Wiek > 10) przyjmie
warto false. PHP nie bdzie wic sprawdza drugiego warunku. Oznacza to, na przykad,
e moesz sprawdzi, czy zmienna zostaa ustalona i czy posiada okrelon warto. Jeeli
zmienna nie zostaa ustalona, PHP skrci instrukcj if i nie bdzie sprawdza jej wartoci. Jest
to prawidowe dziaanie, poniewa jeli bdziesz sprawdza warto nieustalonej zmiennej,
wwczas PHP zgosi bd.
Pomocnym dodatkiem do instrukcji if jest polecenie elseif, ktre pozwala na czne sprawdzenie warunkw w bardziej inteligentny sposb:
<?php
if ($Wiek < 10) {
print "Masz poniej 10 lat";
} elseif ($Wiek < 20) {
print "Masz poniej 20 lat";
} elseif ($Wiek < 30) {
print "Masz poniej 30 lat";
} elseif ($Wiek < 40) {
print "Masz poniej 40 lat";
} else {
print "Masz ponad 40 lat";
}
?>

Uytkownicy Perla powinni zwrci uwag, e piszemy elseif, a nie elsif.

Ten sam efekt moesz uzyska za pomoc polece if, ale uycie elseif jest atwiejsze do
odczytania. Ujemn stron takiego rozwizania jest to, e zmienna $Wiek musi zosta ponownie sprawdzona.
Jeeli posiadasz tylko jedno polecenie kodu do wykonania, moesz si zupenie obej bez
nawiasw klamrowych. Taki wariant jest bardzo czytelny.
Poniej s dwa fragmenty kodu, ktrych wynik jest identyczny:
if ($zablokowany) {
print "Nie masz wstpu!";
}
if ($zablokowany) print "Nie masz wstpu!";

Case Switching
Twoje bloki kodu if...elseif mog osign due rozmiary, kiedy bdziesz sprawdza wiele
warunkw wzgldem tej samej zmiennej, jak zostao to przedstawione poniej:
<?php
$imie = "Bartek";
if ($imie == "Janek") {
print "Twoje imi to Janek\n";
} elseif ($imie == "Lidia") {
print "Twoje imi to Lidia\n";
} elseif ($imie == "Bartek") {
print "Twoje imi to Bartek\n";
} elseif ($imie == "Stasia") {
print "Twoje imi to Stasia\n";

44

Rozdzia 4. Jzyk PHP

} else {
print "Nie wiem, jak masz na imi!\n";
}
?>

PHP posiada odpowiednie rozwizanie dla takich sytuacji: switch/case. W bloku instrukcji
switch/case okrelasz sprawdzany warunek oraz podajesz list moliwych wartoci, ktre
chcesz obsuy. Uywajc polece switch/case moemy przepisa w nastpujcy sposb nasz
poprzedni skrypt:
<?php
$imie = 'Bartek';
switch($imie) {
case "Janek":
print "Twoje imi to
break;
case "Lidia":
print "Twoje imi to
break;
case "Bartek":
print "Twoje imi to
break;
case "Stasia":
print "Twoje imi to
break;
default:
print "Nie wiem, jak
}
?>

Janek\n";
Lidia\n";
Bartek\n";
Stasia\n";
masz na imi!\n";

Polecenia switch/case s czsto uywane do sprawdzenia rnego rodzaju danych i zabieraj


znacznie mniej miejsca ni odpowiadajce im polecenia if.
Mamy dwie istotne kwestie warte odnotowania w kodzie polece switch/case PHP. Po
pierwsze, przed zapisem default nie umieszczamy sowa case jest to po prostu sposb
dziaania jzyka. Po drugie, kad z akcji case koczymy poleceniem break;. Jest to spowodowane faktem, e kiedy PHP odnajdzie na licie pasujcy warunek, wykona przypisan do
niego akcj oraz akcje wszystkich pozostaych odpowiadajcych warunkw umieszczonych poniej (na ekranie przedstawionych na dole). Taki sposb dziaania zosta zaczerpnity bezporednio z jzyka C i w zasadzie jest sprzeczny z intuicj oraz naszym sposobem mylenia.
Rzadko si zdarza sytuacja, w ktrej chciaby wykluczy polecenie break z koca swoich
warunkw case.
Warunek default zostanie wykonany, jeeli PHP nie znajdzie odpowiadajcej wartoci w innych warunkach lub jeli zosta wykonany poprzedzajcy go warunek, ktry nie posiada polecenia break.
Sowo kluczowe break oznacza Wyjd z polecenia switch/case, a efektem jego dziaania jest
zatrzymanie wykonywania przez PHP akcji z wszystkich warunkw case, ktre znajduj si
po znalezieniu tego pasujcego. Bez tego polecenia nasz skrypt spowodowaby wywietlenie:
Twoje imi to Bartek
Twoje imi to Stasia
Nie wiem, jak masz na imi!

Case Switching

45

Ptle
PHP posiada nastpujce sowa kluczowe dotyczce ptli: foreach, while, for oraz do...while.
Ptla foreach zostaa zaprojektowana do pracy z tablicami, a jej dziaanie polega na kolejnym
przejciu przez kady element w tablicy. Moesz jej rwnie uy z obiektami; w takim przypadku przechodzi kolejno przez kad publiczn zmienn tego obiektu.
Najbardziej podstawowe uycie ptli foreach wyciga jedynie wartoci z kadego elementu
tablicy, jak to zostao przedstawione poniej:
foreach($tablica as $wartosc) {
print $wartosc;
}

W zaprezentowanym przykadzie tablica $tablica zostaje poddana dziaaniu ptli, a jej wartoci zostaj wycignite do zmiennej $wartosc. W takiej sytuacji klucze tablicy s cakowicie
ignorowane, co zwykle jest bardziej sensowne, jeli zostaj wygenerowane automatycznie (na
przykad 0, 1, 2, 3 itd.).
Oczywicie, ptli foreach moesz rwnie uy do wydobycia kluczy, na przykad w taki
sposb:
foreach($tablica as $klucz => $wartosc) {
print "$klucz = $wartosc\n";
}

W trakcie pracy z obiektami skadnia 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\n";
}
?>

Ptle PHP while s uywane do wykonywania bloku kodu dopty, dopki warunek jest prawdziwy. Na przykad poniszy kod wykona ptl od 1 do 10, wywietlajc aktualn warto:
<?php
$i = 1;
while($i <= 10) {
print "Liczba $i\n";
$i = $i + 1;
}
?>

46

Rozdzia 4. Jzyk PHP

Zwr uwag, e ponownie PHP uywa blokw kodu przedstawiajcych zakres naszej ptli
ptle while rozpoczynaj si znacznikiem otwierajcym ({), a kocz znacznikiem zamykajcym (}) w celu wyranego powiedzenia PHP, ktre wiersze kodu powinny zosta
uwzgldnione w ptli.
Podobnie jak w przypadku polecenia if, moesz umieci jakiekolwiek wybrane przez siebie
warunki w ptlach while. Istotn kwesti pozostaje zmiana wartoci warunku po kadej ptli; w przeciwnym wypadku ptla bdzie wykonywana w nieskoczono.
Ptle while s najczciej uywane do zwikszenia o jednostk listy, gdy nie ma ograniczenia
dotyczcego liczby wykona ptli. Na przykad:
while(wci s wiersze do odczytania z bazy danych) {
odczytaj wiersz;
przejd do kolejnego wiersza;
}

Bardziej rozpowszechnion form ptli jest ptla for, ktra jest nieco bardziej skomplikowana.
Ptla for jest tworzona na podstawie deklaracji, warunku oraz akcji. Deklaracj jest zdefiniowanie zmiennej licznika ptli oraz ustawienie jej wartoci pocztkowej. Warunkiem jest
sprawdzenie zmiennej licznika ptli w stosunku do wartoci. Natomiast akcja to dziaanie,
ktre powinno nastpi po kadorazowej iteracji do zmiany licznika ptli.
Poniej znajduje si przykad ptli for w PHP:
<?php
for ($i = 1; $i < 10; $i++) {
print "Liczba $i\n";
}
?>

Jak moesz zobaczy, ptla for posiada trzy czci oddzielone rednikami. W czci deklaracyjnej ustalamy zmienn $i, ktrej przypisujemy warto 1. W czci zawierajcej warunek wykonujemy ptl, jeeli zmienna $i ma warto mniejsz ni 10. Na kocu, jako akcj, wykonujemy dodawanie cyfry 1 do wartoci zmiennej $i w trakcie kadego wykonania ptli. Dlatego
te za kadym razem jest wykonywany kod ptli.
Kiedy skrypt zostanie uruchomiony, bdzie liczy od 1 do 10, wywietlajc przy tym aktualn liczb. Zwr uwag, e w rzeczywistoci nie zostanie wywietlony tekst Liczba 10, poniewa okrelilimy, e zmienna $i musi by mniejsza od 10, nie za mniejsza bd rwna.
Poniej znajduj si dane wyjciowe omawianego skryptu:
Liczba
Liczba
Liczba
Liczba
Liczba
Liczba
Liczba
Liczba
Liczba

1
2
3
4
5
6
7
8
9

Konstrukcja do...while jest w PHP podobna do ptli while. Rnic jest to, e ptla do...while
zostanie wykonana przynajmniej jeden raz. Sprbuj przeanalizowa poniszy fragment kodu:
<?php
$i = 11;
do {

Ptle

47

print "Liczba $i\n";


} while ($i < 10);
?>

Jeli zostanie uyty powyszy kod, tekst Liczba 11 zostanie wywietlony przed porwnaniem zmiennej $i wzgldem liczby 10. Jeeli w trakcie sprawdzenia zmienna $i jest mniejsza
od 10, wwczas ptla zostanie wykonana ponownie. Dla porwnania, ten sam kod moe zosta napisany przy uyciu ptli while:
<?php
$i = 11;
while ($i < 10) {
print "Liczba $i\n";
?>

Rnica jest taka, e ptla while mogaby nie przedstawi adnych danych wyjciowych, poniewa sprawdza warto zmiennej $i, zanim rozpocznie wykonywanie ptli. Dlatego te ptle
do...while s zawsze wykonywane przynajmniej jeden raz.

Nieskoczone ptle
Prawdopodobnie uznasz to za zaskakujce, ale nieskoczone ptle mog by czsto pomocne
w Twoich skryptach. Jeeli piszesz program, ktry pozwala uytkownikom na wpisywanie danych tak dugo, jak oni zechc, to nie bdzie on dziaa, jeli umiecisz skrypt w ptli wykonywanej 30000 razy lub nawet 30000000 razy. Zamiast tego kod powinien zosta zaptlony
w nieskoczono, bezustannie przyjmujc dane wprowadzane przez uytkownika, dopki nie
zakoczy on programu poprzez nacinicie kombinacji Ctrl+C.
Poniej znajduj si dwa typy najczstszych ptli dziaajcych w nieskoczono:
<?php
while(1) {
print "W ptli!\n";
}
?>

Poniewa warto 1 rwnie przyjmuje warto prawda, wykonywanie ptli bdzie trwao
w nieskoczono.
<?php
for (;;) {
print "W ptli!\n";
}
?>

W tym przykadzie, w ptli for brakuje czci okrelajcych deklaracj, warunek i akcj, co
oznacza, e ptla bdzie wykonywana w nieskoczono.

Specjalne sowa kluczowe ptli


PHP dostarcza Ci sw kluczowych break i continue, sucych do kontrolowania operacji
ptli. W jednym z poprzednich przykadw uywalimy ju polecenia break podczas omawiania polece switch/case. Wwczas break byo wykorzystywane do wyjcia z bloku switch/
case, taki sam efekt polecenie wywouje w ptli. Kiedy uywamy go wewntrz ptli do kie-

48

Rozdzia 4. Jzyk PHP

rowania zachowaniem ptli, polecenie break powoduje, e PHP opuszcza ptl i kontynuuje
dziaanie natychmiast po niej. Polecenie continue zmusza PHP do przeskoczenia pozostaej
czci biecej iteracji ptli i przejcia do kolejnej.
Uytkownicy Perla powinni zwrci uwag na to, e polecenia break i continue s
odpowiednikami polece last i next w Perlu.

Na przykad:
<?php
for ($i = 1; $i < 10; $i = $i + 1) {
if ($i == 3) continue;
if ($i == 7) break;
print "Liczba $i\n";
}
?>

Jest to zmodyfikowana wersja naszego oryginalnego skryptu dla ptli for. Tym razem dane
wyjciowe przedstawiaj si nastpujco:
Liczba
Liczba
Liczba
Liczba
Liczba

1
2
4
5
6

Zauwa, e brakuje tekstu Liczba 3, a wykonywanie skryptu zostaje zakoczone po wywietleniu Liczba 6. Kiedy biec liczb jest 3, polecenie continue zostaje uyte do przeskoczenia pozostaej czci iteracji ptli i nastpuje przejcie do Liczba 4. Podobnie jeeli aktualn
liczb jest 7, wwczas polecenie break powoduje zakoczenie dziaania ptli.

Ptle wewntrz ptli


W PHP moesz zagnieda ptle, na przykad w taki sposb:
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\n";
}
}
}

Wynikiem dziaania powyszego kodu s nastpujce dane wyjciowe:


I:
I:
I:
I:
I:
I:
I:
I:

1,
1,
1,
1,
2,
2,
2,
2,

J:
J:
J:
J:
J:
J:
J:
J:

1,
1,
2,
2,
1,
1,
2,
2,

K:
K:
K:
K:
K:
K:
K:
K:

1
2
1
2
1
2
1
2

W takiej sytuacji uycie polecenia break jest odrobin bardziej skomplikowane, poniewa spowoduje ono wyjcie jedynie z ptli zawierajcej polecenie break. Na przykad:

Ptle wewntrz ptli

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\n";
break;
}
}
}

Tym razem skrypt wywietli nastpujce dane wyjciowe:


I:
I:
I:
I:

1,
1,
2,
2,

J:
J:
J:
J:

1,
2,
1,
2,

K:
K:
K:
K:

1
1
1
1

Jak moesz si przekona, ptla $k zostanie wykonana tylko jeden raz z powodu wywoania
polecenia break. Jednake pozostae ptle zostan wykonane wiele razy. Moesz zyska wicej
kontroli przez podanie liczby po poleceniu break, na przykad break 2, co spowoduje przerwanie dwch ptli bd polece case/switch. Poniej znajduje si przykad uycia 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\n";
break 2;
}
}
}

Wynik dziaania powyszego skryptu przedstawia si nastpujco:


I: 1, J: 1, K: 1
I: 2, J: 1, K: 1

W powyszym skrypcie ptla zostaa wykonana jedynie dwa razy, poniewa ptla $k wywoaa polecenie break 2, ktre przerwao wykonanie ptli $k oraz $j. Tak wic jedynie ptla $i
zostaa wykonana ponownie. Moglibymy uy nawet polecenia break 3, co oznaczaoby
przerwanie wszystkich trzech ptli i powrt do normalnej kontynuacji wykonywania kodu.
Polecenie break ma zastosowanie zarwno w stosunku do ptli, jak i instrukcji switch/case.
Na przykad:
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\n";
break 2;
case 2:
print "I: $i, J: $j, K: $k\n";
break 3;
}
}
}
}

Wiersz zawierajcy polecenie break 2; przerwie wykonywanie bloku kodu switch/case


i ptli $k, podczas gdy wiersz z poleceniem break 3;, oprcz tych dwch elementw, dodatkowo przerwie wykonywanie ptli $j. Aby przerwa wszystkie ptle z wewntrz konstrukcji
switch/case, wymagane jest uycie polecenia break 4.
50

Rozdzia 4. Jzyk PHP

Przetwarzanie trybw mieszanych


Kluczowa koncepcja w PHP daje moliwo wczenia trybu analizy skadniowej PHP w dowolnym miejscu oraz dowoln liczb razy, nawet wewntrz bloku kodu. Poniej znajduje si
podstawowy skrypt PHP:
<?php
if ($zalogowany == true) {
print "To jest miejsce na
print "To jest miejsce na
print "To jest miejsce na
print "To jest miejsce na
print "To jest miejsce na
}
?>

wiele
wiele
wiele
wiele
wiele

rnych
rnych
rnych
rnych
rnych

elementw";
elementw";
elementw";
elementw";
elementw";

Jak moesz zobaczy, skrypt zawiera wiele polece print, ktre zostan wykonane jedynie
wtedy, gdy zmienna $zalogowany przyjmie warto true. Wszystkie dane wyjciowe zostay
zahermetyzowane w poleceniach print, cho PHP pozwala na opuszczenie bloku kodu PHP,
podczas gdy wci jest otwarty blok kodu polecenia if. Oto przykad, jak to si przedstawia
w praktyce:
<?php
if ($zalogowany ==
}
To jest miejsce
To jest miejsce
To jest miejsce
To jest miejsce
To jest miejsce
<?php
}
?>

true) {
na
na
na
na
na

wiele
wiele
wiele
wiele
wiele

rnych
rnych
rnych
rnych
rnych

elementw
elementw
elementw
elementw
elementw

Wiersze zawierajce tekst To jest miejsce na wiele rnych elementw s wci wysyane
jedynie wtedy, gdy zmienna $zalogowany przyjmuje warto true. Wychodzimy jednak z trybu PHP, aby je wywietli. Nastpnie ponownie wchodzimy do trybu PHP w celu zamknicia polecenia if i kontynuacji wykonywania kodu. Dziki takiemu podejciu cay skrypt staje
si atwiejszy w czytaniu.

Doczanie innych plikw


Jedn z najczstszych operacji w PHP jest wczanie jednego skryptu do drugiego i wspdzielenie tym samym funkcjonalnoci. Do wczenia jednego skryptu do innego uywamy sowa
kluczowego include, podajc nazw pliku, ktry chcemy wczy.
Rozpatrzmy na przykad nastpujcy plik foo.php:
<?php
print "Rozpoczynamy foo\n";
include 'bar.php';
print "Koczymy foo\n";
?>

A oto zawarto pliku bar.php:


<?php
print "W barze\n";
?>

Doczanie innych plikw

51

PHP wczyta plik bar.php, odczyta jego zawarto, a nastpnie umieci j w pliku foo.php w miejscu wiersza include 'bar.php'. Dlatego te plik foo.php bdzie przedstawia si nastpujco:
<?php
print "Rozpoczynamy foo\n";
print "W barze\n";
print "Koczymy foo\n";
?>

By moe dziwisz si, dlaczego zosta dodany jedynie wiersz zawierajcy tekst W barze,
a pominite wiersze zawierajce znaczniki: otwierajcy i zamykajcy. Jest to spowodowane
faktem, e PHP opuszcza tryb PHP za kadym razem, gdy dodaje inny plik, a nastpnie po
powrocie z pliku ponownie przechodzi do trybu PHP. Dlatego te plik foo.php po poczeniu
z plikiem bar.php w rzeczywistoci wyglda nastpujco:
<?php
print "Rozpoczynamy foo\n";
?>
<?php
print "W barze\n";
?>
<?php
print "Koczymy foo\n";
?>

PHP docza plik jedynie wtedy, gdy wiersz zawierajcy polecenie include jest faktycznie wykonywany. Zatem poniszy kod nigdy nie doczy pliku bar.php:
<?php
if (53 > 99) {
include 'bar.php';
}
?>

Jeeli sprbujesz doczy plik, ktry nie istnieje, wwczas PHP wygeneruje komunikat ostrzeenia. Jeli Twj skrypt koniecznie wymaga okrelonego pliku, PHP posiada rwnie sowo
kluczowe require. W przypadku uycia require wywoanie nieistniejcego pliku spowoduje
wystpienie bdu krytycznego i tym samym zatrzymanie wykonywania skryptu. W sytuacji
gdy doczany do skryptu plik jest niezbdny, zazwyczaj najlepszym wyjciem jest skorzystanie z polecenia require.
We wczeniejszych wersjach PHP polecenie require byo odpowiednikiem bezwarunkowego polecenia include. Jeeli polecenie require zostao umieszczone wewntrz
instrukcji warunkowej, wwczas plik by doczany, nawet jeli wyraenie warunkowe
przyjmowao warto false. Taka sytuacja nie ma miejsca w PHP5: pliki s doczane
jedynie wtedy, gdy wyraenie warunkowe (jeli takie istnieje) przyjmuje warto true.

Najczstszym przykadem uycia doczanych plikw jest przechowywanie w nich powszechnie uywanych funkcji, definicji obiektw oraz kodu okrelajcego ukad programu. Jeeli na
przykad Twoja witryna uywa tego samego nagwka HTML na kadej stronie, wwczas
kad stron moesz rozpocz od poniszego wiersza:
include 'header.php';

W ten sposb, jeli bdziesz chcia zmieni nagwek swojej witryny, bdziesz musia przeprowadzi jedynie edycj pliku header.php. Dwa dodatkowe sowa kluczowe, ktre prawdopodobnie rwnie bd uywane, to include_once i require_once. Ich dziaanie odpowiada
odpowiednio poleceniom include i require z t rnic, e plik bd docza tylko jeden
52

Rozdzia 4. Jzyk PHP

raz, nawet jeli sprbujesz to zrobi wielokrotnie. Polecenia include_once i require_once


wspdziel t sam list doczonych ju plikw. Warto odnotowa, e systemy operacyjne,
ktre rozrniaj wielko plikw, na przykad Unix, s w stanie wielokrotnie uy na pliku
polece include_once/require_once, jeli programista uy rnej wielkoci liter w jego nazwie. Na przykad:
<?php
include_once 'bar.php';
include_once 'BAR.php';
include_once 'Bar.php';
?>

W systemie Unix powyszy kod spowoduje prb doczenia trzech rnych plikw, poniewa Unix rozrnia wielko znakw. Rozwizanie jest proste: w przypadku nazw plikw naley zawsze uywa maych liter. W komputerach z systemem Windows nazwy plikw
przeznaczonych do wczenia nie rozrniaj wielkoci liter w PHP 5. Oznacza to, e doczenie plikw BAR.php i bar.php spowoduje wczenie tego samego pliku.
Kiedy prbujesz doda plik za pomoc polecenia include bd require, PHP w pierwszej
kolejnoci sprawdza katalog, z ktrego zosta uruchomiony skrypt. Jeeli plik nie zostanie znaleziony w tym katalogu, wwczas PHP sprawdza ogln ciek dostpu, ktra zostaa zdefiniowana w Twoim pliku konfiguracyjnym php.ini przy uyciu dyrektywy include_path.
Za kadym razem, gdy doczasz plik za pomoc polecenia include lub require, PHP
wymaga jego kompilacji. Jeeli korzystasz z buforowania kodu, ten problem nie wystpuje. W przeciwnym przypadku PHP rzeczywicie wielokrotnie przeprowadza
kompilacj tego samego pliku. Z tego powodu, jeli doczasz rne pliki w tym samym skrypcie, musz one zosta przetworzone i skompilowane za kadym razem.
Dlatego te najlepiej jest uy funkcji include_once(). Jeeli jej dziaanie zakoczy si
niepowodzeniem, sprbuj funkcji get_included_files() i get_required_files(),
ktre informuj Ci o nazwach doczonych ju plikw. Wewntrznie s one takimi
samymi funkcjami, moesz wic uy dowolnej.

Funkcje
Mimo e PHP jest dostarczane z licznymi funkcjami przeznaczonymi do wykonywania szerokiego zakresu zada, by moe zechcesz utworzy swoje wasne funkcje, gdy zajdzie taka
konieczno. Jeli zauwaysz, e powtarzasz wykonywanie tych samych czynnoci lub bdziesz
chcia dzieli kod midzy poszczeglnymi projektami, wwczas funkcje uytkownika s rozwizaniem dla Ciebie.
Pisanie programw monolitycznych, w ktrych wykonywanie kodu rozpoczyna si na pocztku programu i jest kontynuowane bez przerwy do samego koca, jest z punktu widzenia obsugi kodu uznawane jako bdne. W takiej sytuacji nie moesz ponownie uy kodu. Dziki
tworzeniu funkcji Twj kod jest znacznie krtszy, atwy do kontrolowania i obsugi oraz mniej
podatny na wystpienie bdw.

Prosta funkcja uytkownika


Tworzonym przez siebie funkcjom moesz nada dowolne nazwy; obowizuj tutaj te zasady, jakie mamy w nazewnictwie zmiennych PHP (z wyjtkiem znaku $). Nie moesz ponownie definiowa wbudowanych funkcji PHP oraz powiniene zachowa szczegln ostrono
Funkcje

53

i upewni si, e nazwy Twoich funkcji nie koliduj z istniejcymi funkcjami PHP. To, e Ty
nie posiadasz dostpnej funkcji imagepng(), nie oznacza, e inni rwnie jej nie posiadaj.
Najprostsza funkcja uytkownika moe wyglda jak na poniszym przykadzie:
function foo() {
return 1;
}
print foo();

Swoj funkcj definiujesz za pomoc sowa kluczowego function, a nastpnie nazwy funkcji
oraz pary nawiasw. Rzeczywisty kod Twojej funkcji, ktry zostanie wykonany, znajduje si
midzy nawiasami klamrowymi. W przypadku naszej funkcji foo() skada si z pojedynczego
wiersza kodu return 1;, do ktrego wrcimy w dalszych wywodach.
Po zdefiniowaniu funkcji moemy traktowa foo() jak kad inn funkcj. Przekonalimy si
o tym w czwartym wierszu, w ktrym wywietlilimy zwracan przez funkcj warto (znan
jako wartoci zwrotne).

Wartoci zwrotne
Wolno zwraca jedn (i tylko jedn) warto zwrotn z funkcji. Do tego celu jest wykorzystywane polecenie return. W naszym przykadzie moglibymy uy return 'foo'; lub
return 10 + 10; do przekazania wartoci zwrotnych, ale return 1; jest najatwiejszym
i zwykle najczstszym podobnie jak return true;.
Moesz zwrci dowolnie wybran zmienn, tak dugo jak bdzie to po prostu jedna zmienna dowolnego typu: liczba cakowita, acuch, poczenie z baz danych itd. Sowo kluczowe
return ustala warto zwrotn funkcji jako zmienn, ktrej moesz uy, a nastpnie natychmiast wychodzi z funkcji. Moesz rwnie uy zapisu return; oznaczajcego wyjd bez
wysyania z powrotem jakichkolwiek wartoci. Jeeli sprbujesz przypisa zmiennej zwracan
warto funkcji, ktra nie posiada zwracanej wartoci (na przykad uywa zapisu return; zamiast return $wartosc;), wwczas Twoja zmienna zostanie ustalona jako NULL.
Przyjrzyj si poniszemu skryptowi:
<?php
function foo() {
print "W funkcji";
return 1;
print "Opuszczam funkcj...";
}
print foo();
?>

Uruchomienie powyszego skryptu spowoduje wywietlenie komunikatu W funkcji, nastpnie 1, po czym skrypt zakoczy dziaanie. Powodem, dla ktrego nigdy nie zostanie wywietlony tekst Opuszczam funkcj, jest fakt, e wiersz return 1; przekazuje warto 1,
a nastpnie natychmiast koczy dziaanie funkcji. Drugie polecenie print w funkcji foo() nigdy nie zostanie osignite.
Jeeli chcesz przekaza z powrotem wicej ni tylko jedn warto, musisz skorzysta z tablicy.
To zagadnienie zostanie opisane w rozdziale 5.

54

Rozdzia 4. Jzyk PHP

Czsto spotykan sytuacj jest zwracanie wartoci instrukcji warunkowej, na przykad:


return $i > 10;

W powyszym poleceniu, jeli zmienna $i bdzie miaa warto wiksz od 10, operator >
zwrci 1, co jest identyczne z zapisem return 1;. Natomiast w przypadku gdy zmienna $i jest
mniejsza lub rwna 10, wwczas odpowiada to zapisowi return 0;.

Parametry
Projektowane przez Ciebie funkcje mog korzysta z parametrw dziki modyfikacji definicji
funkcji pozwalajcej na przyjcie dowolnej liczby parametrw. Kademu z parametrw moesz
nada nazw, ktra bdzie uywana do odwoania si do parametru wewntrz tej funkcji.
Kiedy wywoasz pniej funkcj, PHP skopiuje wartoci otrzymane dziki tym parametrom,
na przykad w taki sposb:
<?php
function mnozenie($liczba1, $liczba2) {
$wynik = $liczba1 * $liczba2;
return $wynik;
}
$moja_liczba = mnozenie(5, 10);
?>

Po uruchomieniu powyszego skryptu, zmienna $moja_liczba bdzie miaa ustawion warto 50. Funkcja mnozenie() mogaby zosta przepisana w taki sposb, aby zawieraa po prostu
jeden wiersz: return $liczba1 * liczba2. Przedstawiony przykad pokazuje, e moesz
tworzy swoje funkcje o dowolnej dugoci.

Przekazywanie przez referencj


Sprawy znacznie si komplikuj, gdy dochodzimy do referencji, poniewa musisz by w stanie
zarwno przyjmowa parametry przez referencj, jak i zwraca wartoci przez referencj. Do
tego celu wykorzystujemy operator referencji, ktrym jest znak &.
Oznaczenie parametru jako przekazywanego przez referencj nastpuje w definicji funkcji,
a nie w wywoaniu funkcji. Dlatego te zapis:
function mnozenie(&$liczba1, &$liczba2) {

jest prawidowy, podczas gdy zapis:


$moja_liczba = mnozenie(&5, &10);

jest bdny. To oznacza, e jeli posiadasz wielokrotnie uywan funkcj w swoim projekcie,
musisz przeprowadzi jedynie edycj definicji funkcji, aby pobiera zmienne przez referencj.
Przekazywanie danych przez referencj jest czsto dobrym sposobem na skrcenie i uproszczenie czytania Twojego skryptu. Wybr rzadko jest powodowany przez czynniki zwizane
z wydajnoci. Rozpatrzmy poniszy kod:
function kwadrat1($liczba) {
return $liczba * $liczba;
}
$wartosc = kwadrat1($wartosc);
function kwadrat2(&$liczba) {

Funkcje

55

$liczba = $liczba * $liczba;


}
kwadrat2($wartosc);

Pierwszy przykad przekazuje kopi zmiennej $wartosc, mnoy j, a nastpnie zwraca wynik, ktry jest kopiowany z powrotem do zmiennej $wartosc. W przykadzie drugim zmienna $wartosc zostaje przekazana przez referencj i zmodyfikowana bezporednio wewntrz
funkcji. Std zapis kwadrat2($wartosc) jest zupenie wystarczajcy, zamiast kopiowania pierwszego przykadu.
Referencja jest odniesieniem do zmiennej. Jeeli zdefiniowae funkcj, aby przyjmowaa odwoanie do zmiennej, nie moesz przekaza do niej staej. Oznacza to, e naszej definicji kwadrat2()
nie moesz wywoa uywajc zapisu kwadrat2(10);. Liczba 10 nie jest zmienn, tak wic nie
moe zosta potraktowana referencyjnie.

Zwracanie referencji
W przeciwiestwie do przekazywania wartoci przez referencj, co wymaga okrelenia referencyjnej natury parametru w definicji funkcji, w przypadku zwrcenia referencyjnego musisz
wskaza to w definicji oraz w trakcie wywoania. Aby okreli, e funkcja powinna zwraca
referencyjnie, musisz umieci operator referencji przed nazw funkcji. Niezbdne jest rwnie
okrelenie, e wynik funkcji rwnie powinien by referencyjny, w przeciwiestwie do jego
kopiowania uywanego w normalnym przypisaniu, ktre zostao opisane wyej.
Poniej znajduje si przykad takiej konstrukcji:
function &zwroc_rybe() {
$ryba = "Wanda";
return $ryba;
}
$ryba_ref =& zwroc_rybe();

Parametry domylne
W trakcie projektowania swoich funkcji czsto pomocne jest przypisanie wartoci domylnych
parametrom, ktre nie zostan przekazane. PHP robi to w przypadku wikszoci swoich funkcji; przewanie oszczdza Ci to podawania parametrw, ktre s zwykle takie same.
W celu zdefiniowania swoich wasnych wartoci domylnych dla parametrw funkcji, tu za
ustalan zmienn, dodaj sta warto, ktra ma zosta przypisana, jeli nie zostanie przekazany odpowiedni parametr. Na przykad:
function powitanie($imie = "Pawe") {
return "Witaj $imie!\n";
}
powitanie();
powitanie("Pawe")
powitanie("Andrzej");

Uruchomienie powyszego skryptu spowoduje wywietlenie:


Witaj Pawe!
Witaj Pawe!
Witaj Andrzej!

56

Rozdzia 4. Jzyk PHP

Zastanw si nad nastpujc funkcj:


function powitanie($imie, $nazwisko = "Kowalski") {}

Nie oznacza to, e zarwno zmienna $imie, jak i $nazwisko powinny przyj warto Kowalski.
Zamiast tego jedynie zmienna $nazwisko pobiera t warto PHP traktuje te dwie zmienne
jako funkcjonalnie niezalene od siebie, co oznacza, e moesz uy poniszego kodu:
function powitanie($imie = "Jan", $nazwisko = "Kowalski") {
return "Witaj, $imie $nazwisko!\n";
}

Moesz wic uy tego kodu do powitania trzech zacnych osb o nazwiskach: Jan Kowalski,
Tomasz Dawidowski i Tomasz Kowalski:
powitanie();
powitanie("Tomasz", "Dawidowski");
powitanie("Tomasz");

Jeeli chciaby powita osob o nazwisku Jan Wilczak, byoby idealnie, gdyby pozwoli PHP
na przekazanie za Ciebie pierwszego parametru. Jan jest bowiem wartoci domyln w tej
funkcji, a Ty dostarczysz tylko nazwiska Wilczak. Gdy jednak sprbujesz uruchomi poniszy
kod, to stwierdzisz, e on nie dziaa:
powitanie("Wilczak");

Zamiast otrzyma nazwisko Jan Wilczak, otrzymasz Wilczak Kowalski. Poniewa PHP wypenia parametry zaczynajc od lewej strony, zostao przyjte zaoenie, e przekazany przez Ciebie parametr by imieniem. Ta sama logika wskazuje, e nie moesz umieci wartoci domylnej przed elementem nieposiadajcym wartoci domylnej, na przykad w taki sposb:
function powitanie($imie = "Janek", $nazwisko) {}

Jeeli ktokolwiek uyby funkcji w taki sposb: powitanie("Piotr"), powstaoby pytanie, czy
wwczas nastpiaby prba dostarczenia wartoci dla zmiennej $imie zamiast uycia jej wartoci domylnej? A moe uytkownik chciaby uy wartoci domylnej dla imienia, natomiast
Piotr to warto dla zmiennej $nazwisko? Na szczcie PHP zgosi bd, jeli nastpiaby prba
uycia kodu w taki sposb!

Zliczanie parametrw zmiennej


Przedstawiona w rozdziale 7. funkcja printf() posiada moliwo pobrania dowolnej liczby
parametrw moe pobra po prostu jeden parametr lub pi lub pidziesit lub piset.
Liczba elementw moliwych do pobrania jest dowolna, o ile zostan przekazane przez uytkownika. Jest to znane pod nazw lista parametrw zmiennej i bdzie automatycznie implementowane w funkcjach definiowanych przez uytkownika. Na przykad:
function pewna_funkcja($a, $b) {
$j = 1;
}
pewna_funkcja(1, 2, 3, 4, 5, 6, 7, 8);

Przedstawiona powyej funkcja pewna_funkcja() zostaa tak zdefiniowana, aby pobieraa jedynie dwa parametry $a i $b. Moemy j jednak wywoa z omioma parametrami, a skrypt
powinien si uruchomi bez problemw. Istnieje jeden aspekt, w ktrym PHP rni si znacznie od jzyka C: w C Twoje funkcje musz zosta uyte cile w stosunku do deklaracji ich prototypw. W przedstawionym powyej przykadzie warto 1 zostanie umieszczona w zmiennej $a, a warto 2 w zmiennej $b. Co si jednak stanie z pozostaymi parametrami?
Funkcje

57

Pomocne oka si trzy funkcje: func_num_args(), func_get_arg() i func_get_args(), z ktrych pierwsza i ostatnia nie pobieraj parametrw. Aby pobra liczb parametrw, ktre zostay przekazane do Twojej funkcji, wywoaj funkcj func_num_args() i odczytaj jej warto
zwrotn. W celu pobrania wartoci konkretnego parametru uyj funkcji func_get_arg() i przeka jej numer parametru, ktrego warto chcesz otrzyma z powrotem. Na kocu funkcja
func_get_args() zwraca tablic przekazanych parametrw. Poniej znajduje si przykad uycia tych funkcji:
function pewna_funkcja($a, $b) {
for ($i = 1; $i < func_num_args(); ++$i) {
$parametr = func_get_arg($i);
echo "Otrzymano parametr $parametr.\n";
}
}
function pewna_inna_funkcja($a, $b) {
$parametr = func_get_args();
$parametr = join('', '', $parametr);
echo "Otrzymano parametry: $parametr.\n";
}
pewna_funkcja(1, 2, 3, 4, 5, 6, 7, 8);
pewna_inna_funkcja(1, 2, 3, 4, 5, 6, 7, 8);

Uywajc funkcji func_num_args() moesz atwo zaimplementowa sprawdzanie bdw funkcji. Na przykad kad swoj funkcj rozpocznij od upewnienia si, e funkcja func_num_args()
zawiera oczekiwane przez Ciebie elementy, a jeli tak nie jest, zakocz dziaanie funkcji. Kiedy
jednak dodasz ju func_num_arg(), powiniene atwo tworzy swoje wasne funkcje, ktre
bd funkcjonoway z dowoln liczb parametrw.

Zasig zmiennej w funkcjach


Zmienne zdeklarowane na zewntrz funkcji i klas s nazywane globalnymi, co oznacza, e s
oglnie dostpne w kadym miejscu skryptu. Poniewa jednak funkcje s niezalenymi blokami, ich zmienne s niezalene i nie maj wpywu na zmienne w gwnym skrypcie. W ten
sam sposb zmienne z gwnego skryptu nie s bezwarunkowo dostpne wewntrz funkcji.
Spjrz na poniszy przykad:
function foo() {
$bar = "wombat1";
}
$bar = "baz";
foo();
print $bar;

Wykonanie powyszego skryptu rozpocznie si w wierszu $bar = "baz", a nastpnie nastpi


wywoanie funkcji foo(). W tym momencie, jak moesz zobaczy, funkcja foo() ustawi zmiennej $bar warto wombat, po czym zwrci kontrol do gwnego skryptu, gdzie zmienna $bar
zostanie wywietlona. Funkcja foo() zostanie wywoana i nie wiedzc o istnieniu w zasigu
globalnym zmiennej $bar, utworzy w zasigu lokalnym zmienn $bar. Kiedy dziaanie funkcji
zostanie zakoczone, wszystkie lokalne elementy zostan odrzucone, pozostawiajc nienaruszon pierwotn zmienn $bar.
1

Wombat torbacz australijski, rolinoerne zwierz zamieszkujce Australi i Tasmani przyp. tum.

58

Rozdzia 4. Jzyk PHP

Ignorowanie zasigu za pomoc tablicy GLOBALS


Superglobalna tablica $GLOBAS pozwala na dostp do zmiennych globalnych, nawet z wewntrz
funkcji. Wszystkie zmienne zdeklarowane w zasigu globalnym s umieszczone w tablicy
$GLOBALS, do ktrej masz dostp z kadego miejsca skryptu. Poniej znajduje si przykad uycia tablicy $GLOBALS:
function foo()
$GLOBALS['bar'] = "wombat";
}
$bar = "baz";
foo();
print $bar;

Powyszy skrypt spowoduje wywietlenie na ekranie sowa wombat, poniewa funkcja foo()
dosownie zmienia zmienn spoza jej zasigu. Nawet gdy kontrola zostanie zwrcona do gwnego skryptu, ten efekt wci pozostanie. Zmienne moesz odczyta w ten sam sposb:
$lokalny_bar = $GLOBALS['bar'];

Jest to jednak cakiem trudne do odczytania. PHP pozwala Ci na uycie specjalnego sowa
kluczowego GLOBAL, aby zmienna moga by dostpna lokalnie:
function moja_funkcja() {
GLOBAL $foo, $bar, $baz;
++$baz;
}

Taki zapis pozwoli funkcji na odczytanie zmiennych globalnych $foo, $bar i $baz. Wiersz
zawierajcy polecenie ++$baz zwikszy warto zmiennej $baz o 1, co zostanie rwnie odzwierciedlone w zasigu globalnym.

Funkcje rekurencyjne
Czasami najatwiejszym sposobem przedstawienia problemu jest spowodowanie, aby funkcja
wywoaa si samodzielnie to technika zwana rekurencyjnym wywoaniem funkcji. Obliczanie
silni jest tutaj najczciej przytaczanym przykadem. Silnia liczby 6 wynosi 6 5 4 3 2 1
lub 720, a zwykle jest przedstawiona jako 6!. Tak wic silnia liczby 6 (6!) wynosi 720, 7!
wynosi 7 6!, musisz wic obliczy jedynie warto wyraenia 6!, a nastpnie wynik pomnoy przez 7 w celu otrzymania 7!.
Odpowiednie rwnanie moe zosta zapisane w nastpujcy sposb: n! = n ((n1)!).
Oznacza to, e silnia dla danej liczby jest rwna tej liczbie pomnoonej przez silni liczby
pomniejszonej o jeden czysty przypadek funkcji rekurencyjnej. Potrzebujemy funkcji, ktra
bdzie przyjmowaa liczb cakowit, i jeli ta liczba nie jest zerem, wwczas nastpi ponowne
wywoanie funkcji. Tym razem jednak zostanie przekazana ta sama liczba, ale pomniejszona
o jeden, a wynik bdzie pomnoony przez ni sam. Poniej znajduje si dziaajcy skrypt
obliczajcy silni:
function silnia($liczba) {
if ($liczba == 0) return 1;
return $liczba * silnia($liczba-1);
}
print silnia(6);

Funkcje

59

Wynikiem dziaania powyszego skryptu bdzie warto 720, chocia moesz atwo edytowa wywoanie funkcji silnia() i przekaza jej, na przykad, warto 20 zamiast 6. Warto
silni zwiksza si bardzo szybko (7! wynosi 5040, 8! wynosi 40320 itd.), tak wic ostatecznie
osigniesz ograniczenie przetwarzania. Nie chodzi tutaj o czas, ale jedynie o zoono: PHP
pozwala Ci tylko na pewien poziom rekurencyjnoci (18! bdzie maksimum, ktre bdziesz
mg osign w trakcie oblicze przy uyciu tego kodu).
Jak moesz si przekona, funkcje rekurencyjne uatwiaj pewne zadania programistyczne i nie
dotyczy to wycznie matematyki. Pomyl, jak atwo jest napisa funkcj pokaz_odpowiedzi()
na potrzeby forum, ktra bdzie automatycznie pokazywaa wszystkie odpowiedzi na podan
wiadomo, wszystkie odpowiedzi do tych odpowiedzi oraz wszystkie odpowiedzi do tych
odpowiedzi do tych odpowiedzi itd.

60

Rozdzia 4. Jzyk PHP

You might also like