Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
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
Spis treci
Wprowadzenie ..............................................................................13
Cz I
Cz II
Spis treci
Spis treci
7
Funkcje usuwania znakw spacji .............................................................................. 211
Funkcje podstawowe................................................................................................ 212
Przetwarzanie blokw tekstu .................................................................................... 213
Funkcje konwersji znakw ....................................................................................... 215
Funkcje zmiany wielkoci liter ................................................................................. 217
Ustawianie parametrw lokalizacyjnych ................................................................... 218
Funkcje formatujce................................................................................................. 219
Przetwarzanie danych binarnych............................................................................... 221
Funkcje mieszajce .................................................................................................. 223
Oprnianie bufora wyjciowego.............................................................................. 225
Spis treci
9
Operator alternatywy .......................................................................................... 307
Nawiasy grupujce............................................................................................. 307
Wydobywanie grup ............................................................................................ 307
Funkcje pomocnicze................................................................................................. 310
Przykady uycia wyrae regularnych ..................................................................... 311
Nazwy plikw i rozszerzenia .............................................................................. 311
Nazwa pliku i katalogu....................................................................................... 311
Test identyfikatora ............................................................................................. 311
Modyfikacja znacznikw.................................................................................... 312
Konwersja hipercza ......................................................................................... 312
Konwersja adresw e-mail.................................................................................. 312
Pobranie wszystkich unikatowych wyrazw tekstu.............................................. 313
Wnioski................................................................................................................... 314
10
Spis treci
11
Cz V
12
Dodatki ......................................................................................477
Skorowidz...................................................................................479
Rozdzia 9.
Konstrukcje skadniowe
jzyka PHP
W niniejszym rozdziale omwimy konstrukcje skadniowe jzyka PHP. O niektrych
z nich, na przykad o wyraeniu if, bya ju okazja wspomnie wczeniej. Tym razem
jednak zapoznamy si z penym wachlarzem konstrukcji. Nie jest ich zbyt wiele, co
na pewno naley zaliczy do plusw jzyka PHP. Jak pokazuje praktyka, im bardziej
zwiza skadnia jzyka programowania, tym atwiej si nim posugiwa. PHP jest
doskonaym przykadem prawdziwoci tej teorii.
158
if($a>$b) { print "a jest wiksze od b"; $c=$b; }
elseif($a==$b) { print "a jest rwne b"; $c=$a: }
else {print "a jest mniejsze od b"; $c=$b; }
Uwaga w powyszym skrypcie nie bdu! Zamiast else if mona rwnie dobrze pisa
elseif (czyli bez spacji pomidzy tymi dwoma poleceniami), ale prawdopodobnie wikszo programistw uzna pierwszy sposb zapisu za bardziej czytelny.
Konstrukcja if-else ma take skadni alternatywn:
if(wyraenie_logiczne):
wyraenia;
elseif(inne_wyraenie_logiczne):
inne_wyraenia;
else:
wyraenia_alternatywne;
endif
Zwrmy uwag na dwukropek (:)! Jeli zapomnimy umieci go w skrypcie, wygenerowany zostanie komunikat o bdzie. Jak poprzednio, bloki elseif oraz else mona
pomin.
159
Czytelnicy zapewne zgodz si z tym, e skrypt w takiej postaci jest zrozumiay nawet
dla osoby, ktra nie zna PHP, ale, na przykad, orientuje si w kodzie HTML.
Skrypt wywietla liczby stanowice wynik dziaania podnoszcego 2 do potgi z zakresu od 1 do 31. Gdy zmiennej $i przypiszemy warto 32, adna operacja nie zostanie wykonana.
Podobnie jak wyraenie if, take ptla while ma skadni alternatywn, ktra uatwia
czenie skryptw z kodem HTML:
while(wyraenie_logiczne):
wyraenia;
endwhile;
160
Sprawdmy teraz, jak to dziaa. W momencie uruchomienia ptli wykonywane s wyraenia okrelone jako wyraenia_inicjujce (w kolejnoci od lewej do prawej). Oddziela
si je przecinkami, jak w poniszym przykadzie:
for($i=0,$j=10,$k="Test!"; .....)
Dalej rozpoczyna si iteracja. Najpierw sprawdzany jest warunek ptli (jak w konstrukcji
while) i, w przypadku jego spenienia (warto true (prawda)), nastpuje wykonanie
iteracji. Jeli warunek nie zostanie speniony, interpreter zakoczy ptl. Przykad:
// dodaje kolejn kropk
for($i=0,$j=0,$k="Test"; $i<10; .....) $k.=".";
Zamy, e wykonana zostaa jedna iteracja. W takim razie powinno doj do wykonania wyrae po iteracji, ktrych format jest identyczny jak wyrae inicjujcych.
Przykad:
for($i=0,$j=0,$k="Punkty"; $i<100; $j++,$i+=$j) $k=$k.".";
W tym miejscu naley wspomnie, e powyszy przykad (jak rwnie dowolny inny)
mona zaimplementowa take z wykorzystaniem ptli while. Taka konstrukcja nie
bdzie jednak wyglda rwnie dobrze jak ptla for. Oto przykad:
161
$i=0;$j=0;$k="Punkty";
while($i<100) {
$k.=".";
$j++;$i+=$j;
}
C, to ju chyba wszystko Nie, chwileczk! Sprbuj jeszcze zgadn, ile kropek zostanie dodanych do zmiennej $k po zakoczeniu wykonywania ptli.
Ptla for podobnie jak wikszo pozostaych konstrukcji ma skadni alternatywn:
for(wyraenia_inicjujce; warunek_ptli; wyraenia_po_iteracji):
wyraenia;
endfor;
Nowoci jest tutaj standardowa funkcja count(); zwraca ona liczb elementw w tablicy.
Kolejne wyraenie, continue, ma pewn cech wspln z wyraeniem break moe by
uywane tylko w kombinacji z ptl. Jego zadanie polega na natychmiastowym zakoczeniu biecej iteracji i wykonaniu kolejnej (ale co oczywiste tylko w przypadku
162
163
Jest to typowy sposb pisania skryptw dialogowych. Skrypt uruchamiany jest bez
adnych parametrw i uytkownik widzi formularz pytajcy o jego imi, haso i inne tego
typu informacje. Po klikniciu przycisku nastpuje wykonanie operacji zaprogramowanych w skrypcie. Polegaj one na sprawdzeniu, czy kliknito przycisk doSubmit,
a take czy podano nazw i haso. Jeli dane te s nieprawidowe, formularz wywietlany jest ponownie (z komunikatem o bdzie podwietlonym na czerwono). Gdy za
wszystko jest w porzdku, skrypt koczy swoje dziaanie i wywietla rezultaty.
Jak wida, przedstawion tutaj logik do atwo zaadaptowa do konkretnej sytuacji,
o ile tylko znamy metod przerywania wykonywania bloku sprawdzajcego i ponownego wywietlania formularza. Osigamy to przez uycie konstrukcji:
if(warunek) do {...} while(0);
Oczywicie ptla do-while wykonywana jest tylko raz, jako e jej warunek jest zawsze
faszywy. Takiej zwyrodniaej ptli mona jednak uy w sytuacji, gdy zajdzie potrzeba
zakoczenia jej wyraeniem break.
Niektrzy Czytelnicy mog w tym momencie stwierdzi, e w podobnych przypadkach bardziej odpowiednie byoby uycie funkcji i wyraenia return, lecz to jest wanie przykad sytuacji, w ktrej korzystanie z funkcji nie jest zbyt wygodne. Chodzi
o to, e aby pozyska zmienn globaln (w rodzaju elementu formularza) z funkcji,
trzeba wykona dodatkowe operacje. Jest to oczywicie wad PHP i wkrtce przedyskutujemy j szerzej.
Ptla foreach
Ten rodzaj ptli zaprojektowano specjalnie z myl o przegldaniu poszczeglnych
elementw tablicy. Ma ona nastpujc skadni:
foreach(tablica as $klucz=>$warto)
wyraenia;
Ptla foreach ma skadni alternatywn, przydatn zwaszcza wtedy, gdy nie potrzebujemy wartoci klucza biecego elementu. Ten alternatywny format zapisu przedstawia si nastpujco:
164
foreach(tablica as $warto)
wyraenia;
W tym przypadku dostpna jest wycznie warto elementu, natomiast klucz nie.
Jest to uyteczne rozwizanie, na przykad, podczas pracy z tablicami list.
Ptla foreach nie korzysta z prawdziwej tablicy, lecz z jej kopii. Oznacza to, e wszelkie zmiany wprowadzone w tablicy nie bd odzwierciedlane w ptli. Mona jednak
uy rezultatu wykonania funkcji jako tablicy. W takim wypadku funkcj wywouje si
tylko raz, przed rozpoczciem ptli, a wszelkie nastpujce pniej manipulacje s
ju wykonywane na kopii zwrconej wartoci.
165
Wyraenie require
Wyraenie require umoliwia dokonanie podziau tekstu skryptu na czci, z ktrych
kada tworzy oddzielny plik. Skadnia wyraenia wyglda nastpujco:
require nazwa_pliku;
166
Wyraenie include
Wyraenie include jest niemal identyczne z wyraeniem require, z jednym wszake
wyjtkiem. Ot doczany plik staje si czci skryptu nie przed jego wykonaniem,
lecz wanie w czasie wykonywania.
Jak to rnica? Ju wyjaniamy. Zamy, e mamy dziesi plikw tekstowych, nazwanych odpowiednio plik0.php, plik1.php, plik2.php i tak dalej, a do plik9.php.
Kady z tych plikw zawiera cyfr z zakresu od 0 do 9. Uruchamiamy wic nastpujcy program:
for($i=0; $i<10; $i++) {
include "plik$i.php";
}
Translacja i problemy
z uyciem wyraenia include
Jak ju wiemy, skrypt PHP jest przed wykonaniem przeksztacany na jego wewntrzn
reprezentacj. Po zakoczeniu tego procesu w pamici komputera znajduje si ju na
wp upieczony program, bez komentarzy, niektrych nazw zmiennych, formatowania itd. Potem nastpuje interpretacja, czyli wykonanie tej wewntrznej reprezentacji
skryptu. Wiemy jednak, e mog istnie takie fragmenty programu, ktrych nie da si
podda translacji z wyprzedzeniem jest ona wykonywana pniej, gdy interpreter
napotka takie fragmenty podczas wykonywania skryptu.
167
Jednym z takich trudnych fragmentw kodu jest wyraenie include. Gdy tylko interpreter napotka je w skrypcie, zatrzymuje jego wykonanie i wywouje translator, ktrego
zadaniem jest przetworzenie zawartoci doczanego pliku. Zmniejsza to szybko dziaania programu, szczeglnie gdy mamy do czynienia z naprawd duym plikiem. Wniosek
z tego taki, e gdy pracujemy nad rozlegym i bardzo zoonym skryptem, powinnimy unika wyraenia include, zastpujc je gdzie to tylko moliwe wyraeniem
require.
Powysza rada zyskuje na znaczeniu, jako e mamy w perspektywie moliwo pojawienia si ktrego dnia kompilatora PHP. Cechowaby si on zdolnoci przechowywania przetumaczonego kodu w plikach wykonawczych (tak jak ma to miejsce
w programach tworzonych w jzyku Perl). Wwczas uycie wyraenia include powodowaoby zamieszanie, bo kompilator nie wiedziaby, gdzie szuka danych plikw
i ostatecznie nie mogyby one trafi do plikw wykonawczych.
Ktre z wyrae jest zatem lepsze: require czy include? Gdy jestemy pewni, e dany
plik powinien by doczony tylko raz i w jednym konkretnym miejscu, skorzystajmy
z wyraenia require. W innym wypadku korzystniejsze moe by uycie wyraenia
include.
Programista Antek postanowi stworzy podobne funkcje dla programu Word, co zaowocowao powstaniem kolejnej biblioteki, o nazwie wlib.php. Poniewa programy Excel
i Word maj ze sob wiele wsplnego, Antek postanowi skorzysta z biblioteki
xllib.php, odwoujc si do niej za pomoc wyraenia require (listing 9.8).
Nie mino wiele czasu i obydwie biblioteki zyskay sobie tak popularno, e zaczli
z nich korzysta inni programici tworzcy na potrzeby sieci. Przy tym nikt nie zawraca sobie gowy konstrukcj bibliotek; po prostu doczali je do skryptw za pomoc
wyraenia require.
168
Listing 9.8. Biblioteka wlib.php
<?
require "xllib.php";
function LoadWDocument($filename) {...}
function SaveWDocument($filename,$doc) {...}
?>
Jak wida, plik xllib.php zosta doczony dwukrotnie: najpierw porednio przez
bibliotek wlib.php, a potem ju bezporednio przez sam program. Dlatego wanie
translator zgosi bd, gdy napotka lini oznaczon w powyszym skrypcie pogrubion czcionk.
Oczywicie autor nieszczsnego skryptu mgby wczeniej przeanalizowa plik rdowy biblioteki wlib.php i wwczas na pewno odkryby, e nie powinien dopuci do
dwukrotnego doczenia pliku xllib.php. Nie takiego jednak rozwizania oczekujemy.
Gdy dochodzi do poredniego, zagniedonego doczania plikw, jedynym sposobem na rozwikanie problemu wydaje si modyfikacja bibliotek. Ale tego nie chcemy.
Co wic powinnimy zrobi?
169
C, po tak dugim wprowadzeniu (ale chyba nie za dugim?), czas pozna opini twrcw PHP. Ot oferuj oni bardzo eleganckie rozwizanie wszystkich naszych bolczek: wyraenia include_once oraz require_once.
Wyraenie require_once dziaa niemal identycznie jak wyraenie require z jednym
tylko, lecz zasadniczym, wyjtkiem. Gdy okae si, e dany plik zosta ju wczeniej
doczony do skryptu, wyraenie nie robi nic. Oczywicie takie rozwizanie wymaga
od interpretera PHP przechowywania penych nazw wszystkich doczonych plikw.
I tak te si dzieje.
Podobnie rzecz si ma z wyraeniem include_once z t rnic, e dziaa ono w fazie
wykonywania programu, a nie w fazie jego translacji.
Jak ju wspomniano, w PHP dostpna jest wewntrzna tablica, w ktrej przechowywane s pene nazwy wszystkich doczonych plikw. Zawarto tej wanie tablicy
sprawdzana jest przez wyraenia include_once oraz require_once. Co wicej, dodawanie wartoci do tej tablicy jest take realizowane przez wyraenia require i include.
I wanie dlatego po doczeniu pliku do skryptu, na przykad przez wyraenie require,
danie ponownego doczenia tego samego pliku przez wyraenie require_once
jest po prostu ignorowane.