Professional Documents
Culture Documents
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
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
Wprowadzenie ............................................................................................................... 9
1. Wprowadzenie do PHP ..................................................................................................13
Historia PHP
Zalety PHP
Uzyskiwanie pomocy
Uzyskanie certyfikatu
rda wiedzy o PHP
13
14
16
20
20
23
26
29
30
31
32
33
34
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
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
Spis treci
104
104
145
146
148
149
150
150
151
157
158
159
162
163
164
165
168
169
170
172
174
174
178
182
183
185
186
187
188
190
196
197
198
198
199
199
200
Spis treci
Inne funkcje OB
Oprnianie danych wyjciowych
Kompresja danych wyjciowych
Przepisywanie URL
201
201
203
204
207
209
213
217
219
220
221
222
222
223
225
226
227
228
229
231
231
231
235
242
247
251
252
Spis treci
253
254
254
258
258
259
260
261
263
265
266
267
269
270
273
275
277
278
280
282
285
287
290
290
293
295
296
297
297
299
301
302
304
307
313
315
318
322
329
Spis treci
337
338
338
339
340
341
342
344
345
345
346
347
350
351
354
354
355
355
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
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
$1Imie
$Imie91
$_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
<?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';
?>
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
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
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-
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.
Poniej znajduje si odpowiednik przedstawionego wyej skryptu, tym razem napisany przy
uyciu standardowych otwierajcych i zamykajcych znacznikw PHP:
<?php
print "Witaj, wiecie!";
?>
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
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";
}
?>
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
} 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";
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";
}
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
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
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.
48
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.
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:
49
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;
}
}
}
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;
}
}
}
}
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.
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
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.
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
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.
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
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");
56
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!
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.
Wombat torbacz australijski, rolinoerne zwierz zamieszkujce Australi i Tasmani przyp. tum.
58
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