Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
PHP i MySQL.
Dla kadego
Autor: Marcin Lis
ISBN: 83-7361-694-2
Format: B5, stron: 592
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
Wstp .............................................................................................. 9
Rozdzia 1. Podstawy ....................................................................................... 11
Czym jest PHP? .............................................................................................................. 11
Krtka historia PHP ........................................................................................................ 11
Instalacja ........................................................................................................................ 12
Linux ........................................................................................................................ 13
Windows .................................................................................................................. 15
Konfiguracja ................................................................................................................... 18
Pierwszy skrypt .............................................................................................................. 19
Jak to dziaa? .................................................................................................................. 20
Spis treci
Spis treci
Rozdzia 4.
Tablice i obiekty
Tablice
Tablice to wystpujce w wikszoci jzykw programowania struktury, pozwalajce
na przechowywanie zbioru danych okrelonego typu. Tablic mona sobie wyobrazi
jako wektor elementw, taki jak zaprezentowany na rysunku 4.1. Zawartoci pojedynczej komrki tablicy moe by warto dowolnego typu danych. W PHP dostpne s
dwa rodzaje tablic: klasyczne (indeksowane numerycznie) oraz asocjacyjne. Dostp do
poszczeglnych danych zawartych w tablicy uzyskuje si poprzez podanie indeksu (inaczej klucza), pod ktrym dana warto zostaa zapisana.
Rysunek 4.1.
Struktura typowej
tablicy
Tablice zwyke
Aby utworzy prost tablic indeksowan numerycznie, naley uy sowa kluczowego
array w schematycznej postaci:
$tablica = array("warto1", "warto2",..., "warton");
gdzie: tablica to nazwa zmiennej tablicowej, dziki ktrej bdziemy mogli si do tej
tablicy odwoywa, natomiast wart1, wart2 itd. to wartoci kolejnych komrek. W przypadku duej liczby wartoci w celu zwikszania czytelnoci mona rwnie zastosowa zapis w postaci:
$tablica = array(
"warto1",
"warto2",
...,
"warton");
104
Zobaczmy, jak to bdzie wyglda w praktyce. Obrazuje to skrypt widoczny na listingu 4.1.
Listing 4.1. Deklaracja prostej tablicy
<?php
$kolory = array("czerwony", "zielony", "niebieski");
echo("kolory[0] = $kolory[0] <br>");
echo("kolory[1] = $kolory[1] <br>");
echo("kolory[2] = $kolory[2] <br>");
?>
Powstaa tutaj tablica o nazwie kolory, ktrej kolejnym komrkom zostay przypisane
cigi znakw okrelajce kolory: czerwony, zielony i niebieski. Aby uzyska dostp do
wartoci zapisanej w danej komrce, naley poda jej numer (indeks) w nawiasach kwadratowych wystpujcych za nazw tablicy. Naley przy tym pamita, e indeksowanie tablicy zaczyna si od zera, co oznacza e indeksem pierwszej komrki jest 0,
a NIE 1. Aby zatem odczyta zawarto pierwszej komrki, piszemy $kolory[0], drugiej komrki $kolory[1], a trzeciej komrki $kolory[2]. Dziki temu po uruchomieniu skryptu na ekranie ukae si widok przedstawiony na rysunku 4.2.
Rysunek 4.2.
Wywietlenie
zawartoci
tablicy kolory
Tablica moe zosta rwnie utworzona poprzez bezporednie przypisywanie wartoci jej komrkom. Przykadowo zamiast pisa:
$kolory = array("czerwony", "zielony", "niebieski");
105
W ten sam sposb mona rwnie zmienia zawarto poszczeglnych komrek. Tak
technik obrazuje skrypt przedstawiony na listingu 4.3.
Listing 4.3. Modyfikacja komrek tablicy
<?php
$kolory[0] = "czerwony";
$kolory[1] = "zielony";
$kolory[2] = "niebieski";
echo("Pierwotna zawarto tablicy: <br>");
for($i = 0; $i < 3; $i++){
$kolor = $kolory[$i];
echo("kolory[$i] = $kolor <br>");
}
$kolory[0] = "ty";
$kolory[1] = "fioletowy";
$kolory[2] = "czarny";
echo("<br>Zawarto tablicy po zmianach: <br>");
for($i = 0; $i < 3; $i++){
$kolor = $kolory[$i];
echo("kolory[$i] = $kolor <br>");
}
?>
W pierwszej czci skryptu powstaa tablica kolory, ktrej kolejnym indeksom zostay
przypisane wartoci czerwony, zielony i niebieski. cilej rzecz ujmujc tablica powstaa po wykonaniu instrukcji $kolory[0] = "czerwony";. PHP po napotkaniu tej instrukcji i stwierdzeniu, e w skrypcie nie ma tablicy o nazwie kolory, tworzy j i przypisuje komrce o indeksie 0 warto wystpujc midzy cudzysowami. Kolejne dwie
instrukcje to nic innego jak utworzenie kolejnych dwch komrek w tablicy kolory
i przypisanie im wskazanych wartoci. Po przeprowadzeniu wymienionych operacji jest
wykonywana ptla for, ktra wywietla zawarto caej tablicy w przegldarce.
Za ptl znajduje si instrukcja $kolory[0] = "ty";. Poniewa istnieje ju tablica
o nazwie kolory, powoduje ona przypisanie komrce o indeksie 0 cigu znakw ty.
W tym momencie zostaje rwnie utracona poprzednia zawarto tej komrki, czyli cig
czerwony. Podobnie dziaaj dwie kolejne instrukcje. Zamieniaj wystpujce w tablicy
wartoci z komrek 1 i 2 na cigi znakw fioletowy i czarny. Po przeprowadzeniu tych
operacji jest wykonywana druga ptla for, ktra wysya do przegldarki aktualn zawarto tablicy. Tym samym po wykonaniu skryptu na ekranie zobaczymy widok zaprezentowany na rysunku 4.3.
(05-09-12)
105
106
Rysunek 4.3.
Ilustracja dziaania
skryptu z listingu 4.3
Tablice asocjacyjne
Oprcz tablic indeksowanych numerycznie w PHP istniej rwnie tablice asocjacyjne.
W tablicach tego typu kademu indeksowi mona nada unikaln nazw, czyli zamiast
indeksw 0, 1, 2 itd. mog wystpowa indeksy: kolor, autor, procesor itp. Najczciej te zamiast terminu indeks stosuje si inny termin klucz. Mwimy zatem, e
w tablicy asocjacyjnej wystpuj pary klucz-warto, w ktrych kady klucz jednoznacznie identyfikuje przypisan mu warto. Tablic tego typu tworzy si podobnie
jak w przypadku tablic klasycznych indeksowanych numerycznie za pomoc sowa
kluczowego array; konstrukcja ta ma jednak nieco inn posta. Schematycznie wyglda
to nastpujco:
array(
klucz1 => warto1,
klucz2 => warto2,
...
kluczn => warton
);
Na listingu 4.4 zosta przedstawiony krtki skrypt, ktry pokazuje, w jaki sposb utworzy tablic asocjacyjn i odczyta zapisane w niej wartoci.
Listing 4.4. Utworzenie tablicy asocjacyjnej
<?php
$kolory = array(
"kolor1" => "czerwony",
"kolor2" => "zielony",
"kolor3" => "niebieski"
);
echo("Zawarto tablicy:<br>");
echo("kolory['kolor1'] = ");
echo($kolory['kolor1']);
107
echo("<br>kolory['kolor2'] = ");
echo($kolory['kolor2']);
echo("<br>kolory['kolor3'] = ");
echo($kolory['kolor3']);
?>
W skrypcie zostaa utworzona tablica kolory, zawierajca trzy klucze o nazwach: kolor1,
kolor2 i kolor3. Kluczowi kolor1 zosta przypisany cig znakw czerwony, kluczowi
kolor2 cig znakw zielony, a kluczowi kolor3 cig znakw niebieski. Dziki
temu po zastosowaniu konstrukcji w schematycznej postaci:
nazwa_tablicy['nazwa_klucza']
Na listingu 4.5 zosta przedstawiony skrypt, ktry realizuje takie samo zadanie jak
skrypt 4.4, czyli utworzenie tablicy asocjacyjnej i wywietlenie jej zawartoci, ale wykorzystujcy zaprezentowan powyej skadni.
Listing 4.5. Drugi sposb tworzenia tablic asocjacyjnych
<?php
$kolory['kolor1'] = "czerwony";
$kolory['kolor2'] = "zielony";
$kolory['kolor3'] = "niebieski";
echo("Zawarto tablicy:<br>");
echo("kolory['kolor1'] = ");
echo($kolory['kolor1']);
(05-09-12)
107
108
Konstrukcja tego typu ptli oznacza, e w kadym jej przebiegu pod zmienn kolor
bdzie podstawiana warto kolejnego klucza. A zatem zmienna kolor w pierwszym
przebiegu ptli bdzie zawieraa cig znakw czerwony, w drugim przebiegu cig
znakw zielony, a w trzecim przebiegu cig znakw niebieski. W momencie kiedy
zostan odczytane wartoci wszystkich kluczy, ptla zakoczy dziaanie. W ten sposb
uzyskamy jednak jedynie wartoci kluczy, nie za nazwy kluczy. Jeli rwnie ta informacja jest nam potrzebna, trzeba zastosowa drug wersj ptli foreach. Przykad tej
konstrukcji zosta zaprezentowany na listingu 4.7.
Listing 4.7. Inna wersja ptli foreach
<?php
$kolory['kolor1'] = "czerwony";
$kolory['kolor2'] = "zielony";
$kolory['kolor3'] = "niebieski";
echo("Zawarto tablicy:<br>");
109
Tym razem, w kadym przebiegu ptli, pod zmienn klucz podstawiana jest nazwa kolejnego klucza, a pod zmienn kolor warto przypisana temu kluczowi. Dziki
temu, za pomoc instrukcji echo, moemy wysa do przegldarki wszystkie istotne informacje o zawartoci tablicy. Efekt dziaania kodu bdzie taki sam jak skryptu z listingu 4.4 (rysunek 4.4).
Modyfikacji zawartoci tablic asocjacyjnych dokonuje si analogicznie do zmian w przypadku tablic klasycznych. Oczywicie zamiast indeksw numerycznych trzeba zastosowa wartoci kluczy. Aby zatem przypisa now warto ju istniejcemu kluczowi,
trzeba skorzysta z konstrukcji, ktrej schematyczna posta jest nastpujca:
nazwa_tablicy['nazwa_klucza'] = warto;
Na listingu 4.8 pokazany zosta przykadowy skrypt, ktry wykonuje modyfikacj zawartoci tablicy asocjacyjnej kolory.
Listing 4.8. Modyfikacja zawartoci tablicy asocjacyjnej
<?php
$kolory['kolor1'] = "czerwony";
$kolory['kolor2'] = "zielony";
$kolory['kolor3'] = "niebieski";
echo("Zawarto tablicy po utworzeniu:<br>");
foreach($kolory as $klucz => $kolor){
echo("kolory['$klucz'] = $kolor");
echo("<br>");
}
$kolory['kolor1'] = "ty";
$kolory['kolor2'] = "fioletowy";
$kolory['kolor3'] = "czarny";
echo("<br>Zawarto tablicy po modyfikacji:<br>");
foreach($kolory as $klucz => $kolor){
echo("kolory['$klucz'] = $kolor");
echo("<br>");
}
Tablica kolory jest tu tworzona w sposb analogiczny do przedstawionego w poprzednim przykadzie. Tak samo jest rwnie wywietlana jej pierwotna zawarto. Kluczowi kolor1 zosta przypisany cig znakw czerwony, kluczowi kolor2 cig znakw zielony, a kluczowi kolor3 cig znakw niebieski. Po wykonaniu ptli for
wywietlajcej te dane na ekranie wykonywana jest instrukcja $kolory['kolor1'] =
"ty";. Poniewa tablica kolory ju istnieje i jest w niej zawarty klucz kolor1, nastpuje modyfikacja przypisanej do niego wartoci, z czerwony na ty. Analogiczne
(05-09-12)
109
110
Tablice wielowymiarowe
Do tej pory omawialimy tablice jednowymiarowe, czyli takie, ktre s wektorami elementw, o strukturze przedstawionej na rysunku 4.1. Aby odczyta dane z pojedynczej komrki, wystarczyo poda jej indeks lub, w przypadku tablic asocjacyjnych,
nazw klucza. PHP umoliwia jednak budowanie bardziej skomplikowanych struktur
tablic wielowymiarowych. Przykadowa struktura prostej tablicy dwuwymiarowej
zostaa przedstawiona na rysunku 4.6. Jak wida, aby otrzyma warto danej komrki,
trzeba zna dwie liczby okrelajce jej pooenie: numer rzdu i numer kolumny. Na
przykad komrka zawierajca warto 8 znajduje si w rzdzie o indeksie 1 i kolumnie o indeksie 2.
Rysunek 4.6.
Struktura przykadowej
tablicy dwuwymiarowej
111
Sprbujmy wykona prosty przykad. Na listingu 4.9 zosta zaprezentowany kod tworzcy tablic dwuwymiarow, w ktrej komrkach zostay zawarte kolejne liczby od
1 do 6, i wywietlajcy jej zawarto na ekranie.
Listing 4.9. Tworzenie tablicy dwuwymiarowej
<?php
$tablica = array(
array(1, 2, 3),
array(4, 5, 6)
);
echo("tablica[0][0]
echo("tablica[0][1]
echo("tablica[0][2]
echo("tablica[1][0]
echo("tablica[1][1]
echo("tablica[1][2]
?>
=
=
=
=
=
=
"
"
"
"
"
"
.
.
.
.
.
.
$tablica[0][0]
$tablica[0][1]
$tablica[0][2]
$tablica[1][0]
$tablica[1][1]
$tablica[1][2]
.
.
.
.
.
.
"<br>");
"<br>");
"<br>");
"<br>");
"<br>");
"<br>");
Konstrukcja tworzca tablic tablica dosy dokadnie odzwierciedla sposb, w jaki ona
powstaje. W pierwszej komrce (o indeksie 0) zostaa umieszczona tablica trjelementowa zawierajca liczby 1, 2, 3, natomiast w komrce drugiej (o indeksie 1) zostaa
umieszczona, rwnie trjelementowa, tablica zawierajca liczby 4, 5, 6. Utworzylimy
wic w ten sposb struktur o dwch rzdach i trzech kolumnach. Dostp do poszczeglnych komrek wymaga zatem podania numeru wiersza i kolumny, schematycznie:
$tablica[wiersz][kolumna]
(05-09-12)
111
112
Zewntrzna ptla for, ze zmienn iteracyjn i, kontroluje numer aktualnie odczytywanego wiersza tablicy, natomiast wewntrzna ptla for, ze zmienn iteracyjn j, kontroluje numer aktualnie odczytywanej kolumny tablicy. Wartoci kolejnych komrek
s po odczytaniu zapisywane w zmiennej pomocniczej wart, ktra jest nastpnie wykorzystywana jako parametr instrukcji echo.
Tablice wielowymiarowe nie musz by indeksowane numerycznie; mog by rwnie
strukturami asocjacyjnymi. Kademu indeksowi mona przypisa jego wasn nazw.
Sprbujmy wic utworzy i tak tablic. Zamy, e maj by w niej przechowywane dane dotyczce ksiek w bibliotece. Pojedynczy wiersz przechowywa bdzie dane
dotyczce tytuu, autora i numeru katalogowego. Podstawowa tablica bdzie moga przechowywa wiele takich wierszy, a wic opisywa wiele ksiek. Jej struktura bdzie
zatem nastpujca:
$tablica = array(
array("Autor" =>
"Tytu" =>
"Numer" =>
array("Autor" =>
"Tytu" =>
"Numer" =>
array("Autor" =>
"Tytu" =>
"Numer" =>
);
"Autor1",
"Tytu1",
"Numer1"),
"Autor2",
"Tytu2",
"Numer2"),
"Autor3",
"Tytu3",
"Numer3")
W ten sposb otrzymalibymy sam zbir ksiek. Ksiki w bibliotece zazwyczaj stoj
jednak na regaach. Moglibymy wprowadzi wic dodatkow tablic opisujc regay.
Jej zawartoci byyby tablice opisujce ksiki. Powstaaby w ten sposb struktura
trjwymiarowa, schematycznie przedstawiona na rysunku 4.8. Sprbujmy zbudowa tak tablic, wprowadzajc do niej przykadowe dane, i wywietli jej zawarto na
ekranie. To zadanie realizuje skrypt widoczny na listingu 4.11.
113
Rysunek 4.8.
Schematyczna struktura
tablicy trjwymiarowej
"Autor1",
"Tytu1",
"Numer1"),
"Autor2",
"Tytu2",
"Numer2"),
"Autor3",
"Tytu3",
"Numer3")
"Autor4",
"Tytu4",
"Numer4"),
"Autor5",
"Tytu5",
"Numer6"),
"Autor6",
"Tytu6",
"Numer6")
"Autor7",
"Tytu7",
"Numer7"),
"Autor8",
"Tytu8",
"Numer8"),
"Autor9",
"Tytu9",
"Numer9")
(05-09-12)
113
114
Mamy tu zatem tablic gwn o nazwie biblioteka. Zawiera ona trzy klucze o nazwach rega1, rega2 i rega3. Pod kadym kluczem znajduj si kolejne tablice, zawierajce dane opisujce ksiki w danym regale. Kada taka tablica skada si z serii
tablic jednowymiarowych o kluczach Autor, Tytu i Numer. Razem tworzy to peny opis
ksiek w bibliotece. Poniewa rczne pobieranie danych w celu wywietlenia caej zawartoci tablicy biblioteka byoby bardzo niewygodne i czasochonne, do ich prezentacji zostay wykorzystane dwie zagniedone ptle foreach.
Ptla zewntrzna odczytuje zawarto kluczy tablicy gwnej biblioteka. Pod zmienn regal_nazwa podstawiane s nazwy odczytanych kluczy, natomiast pod zmienn
regal ich zawarto. Zawartoci kadego klucza jest tablica zawierajca spis ksiek z danego regau, a zatem do jej odczytania wykorzystywana jest wewntrzna ptla
foreach. Ptla ta odczytuje zawarto kolejnych komrek tablicy regal, podstawiajc je
pod zmienn ksiazka. Zawarto tej zmiennej bdzie niczym innym, jak tablic jednowymiarow opisujc pojedyncz ksik. Indeksami tej tablicy s wic: Autor, Tytu
i Numer. Dane te s odczytywane, zapisywane w zmiennych pomocniczych i wysyane do
przegldarki za pomoc instrukcji echo. Ostatecznie na ekranie zobaczymy zawarto
caej biblioteki z podziaem na regay, tak jak zostao to przedstawione na rysunku 4.9.
Rysunek 4.9.
Efekt dziaania
skryptu
z listingu 4.11
Tablice nieregularne
Tablice wielowymiarowe wcale nie musz mie regularnie prostoktnych ksztatw, tak
jak prezentowane w poprzednich akapitach. Prostoktnych to znaczy takich, gdzie
w kadym wierszu znajduje si taka sama liczba komrek (czyli struktur podobnych do
115
prezentowanej na rysunku 4.6). Nic nie stoi na przeszkodzie, aby stworzy struktur
trjktn (rysunek 4.10a) lub te cakiem nieregularn (rysunek 4.10b). Przy tworzeniu takich struktur czeka nas jednak wicej pracy ni w przypadku tablic regularnych,
gdy przewanie kady wiersz trzeba bdzie tworzy oddzielnie.
Rysunek 4.10.
Przykady
nieregularnych tablic
wielowymiarowych
Jak tworzy tego typu struktury? Wiemy ju, e tablice wielowymiarowe to tak naprawd tablice tablic jednowymiarowych. A zatem tablica dwuwymiarowa to tablica
jednowymiarowa zawierajca szereg tablic jednowymiarowych, tablica trjwymiarowa
to tablica jednowymiarowa zawierajca w sobie tablice dwuwymiarowe itd. Sprbujmy zatem stworzy struktur widoczn na rysunku 4.10b, wypenion wartociami od 1
do 10, i wywietli jej zawarto w przegldarce. To zadanie realizuje kod widoczny na
listingu 4.12.
Listing 4.12. Tworzenie tablicy nieregularnej
<?php
$tablica = array
(
array(1, 2, 3, 4),
array(5, 6),
array(7),
array(8, 9, 10)
);
foreach($tablica as $tab){
foreach($tab as $val){
echo("$val ");
}
echo("<br>");
}
?>
Posta skryptu nie powinna by adnym zaskoczeniem. Sposb tworzenia tablicy jest
analogiczny do przedstawionego w poprzednich przykadach, z t rnic, e tym razem tablice skadowe maj rne wielkoci. Pierwsza zawiera cztery komrki, druga
dwie, trzecia jedn, a czwarta trzy. Sposb odczytywania zawartoci jest rwnie podobny do przykadu z listingu 4.12, a nawet nieco prostszy. Ptla zewntrzna odczytuje
kolejne komrki tablicy tablica. Kada z tych komrek zawiera kolejn tablic o pewnej liczbie elementw, ktre odczytywane s za pomoc wewntrznej ptli foreach. Tym
samym po uruchomieniu skryptu zobaczymy widok jak na rysunku 4.11.
(05-09-12)
115
116
Rysunek 4.11.
Zawarto tablicy
nieregularnej
z przykadu 4.12
Operacje na tablicach
Sortowanie tablic klasycznych
Jedn z operacji czsto wykonywanych na tablicach jest sortowanie, czyli ustawienie
elementw w danym porzdku. PHP oferuje kilka wbudowanych funkcji sortujcych.
Zobaczmy, w jaki sposb mona z nich korzysta. Funkcj podstawow jest sort.
Dziaa ona zarwno na wartociach liczbowych, jak i na cigach znakw. Jako argument
jej wywoania naley poda nazw tablicy. Spjrzmy na listing 4.13. Zawiera on kod
sortujcy dwie rne tablice.
Listing 4.13. Sortowanie za pomoc funkcji sort
<?php
$tab1 = array(5, 7, 3, 1, 8, 2, 0, 4, 9, 6);
$tab2 = array('jeden', 'dwa', 'trzy', 'cztery', 'pi');
echo("Zawarto tablic przed sortowaniem: <br>");
foreach($tab1 as $val)
echo("$val ");
echo("<br>");
foreach($tab2 as $val)
echo("$val ");
sort($tab1);
sort($tab2);
echo("<br><br>Zawarto tablic po sortowaniu: <br>");
foreach($tab1 as $val)
echo("$val ");
echo("<br>");
foreach($tab2 as $val)
echo("$val ");
?>
Efekt wykonania skryptu zosta przedstawiony na rysunku 4.12. Jak wida, obie tablice
zostay poprawnie posortowane. Oczywicie w przypadku tablicy tab1 mielimy do czynienia z sortowaniem liczb i wartoci zostay ustawione od najmniejszej do najwikszej,
117
Rysunek 4.12.
Efekt sortowania
tablic
natomiast w przypadku tablicy tab2 nastpio sortowanie cigw znakw, a zatem sowa zostay ustawione w porzdku alfabetycznym. Co jednak zrobi w sytuacji, gdybymy chcieli wykona sortowanie odwrotne, czyli np. ustawi wartoci z tablicy tab1 od
najwikszej do najmniejszej? Nie ma z tym najmniejszego problemu. Wystarczy uy
funkcji rsort (z ang. reverse sort), ktra wykona to zadanie.
Wicej problemw przysporzy nam sytuacja, w ktrej bdziemy chcieli ustawi elementy tablicy w specyficznej kolejnoci, odmiennej od standardowego porzdku. Mamy
wtedy do wyboru dwie drogi. Albo sami napiszemy ca funkcj wykonujc sortowanie, albo te wykorzystamy specjaln wersj funkcji sortujcej usort i napisan przez nas funkcj porwnujc dwa elementy. Schematyczne wywoanie takiej
funkcji ma posta:
usort($tablica, 'nazwa_funkcji')
(05-09-12)
117
118
}
else{
if($e2 % 2 == 0){
return 1;
}
else{
return $e1 - $e2;
}
}
Tablica jest tworzona w standardowy sposb i jej pocztkowa zawarto jest wywietlana na ekranie. Nastpnie wywoywana jest funkcja usort, wykonujca operacj sortowania, i zawarto posortowanej tablicy jest ponownie wywietlana na ekranie. Tym
samym w przegldarce ukae si obraz widoczny na rysunku 4.13. Jak wida, ukad liczb
jest zgodny z naszymi zaoeniami; najpierw umieszczone s liczby podzielne przez
dwa, od najmniejszej do najwikszej, a za nimi liczby niepodzielne przez dwa, rwnie
od najmniejszej do najwikszej. Za takie uporzdkowanie elementw tablicy odpowiada
kombinacja funkcji usort i sortuj.
Rysunek 4.13.
Efekt
niestandardowego
sortowania
Funkcja usort realizuje algorytm sortowania typu QuickSort. Poniewa chcemy, aby
sortowanie odbywao si wedug niestandardowych zasad, musimy jej dostarczy dodatkow funkcj, ktra bdzie porwnywaa dwa dowolne elementy tablicy tab1. T
funkcj jest sortuj. Przy porwnywaniu dwch dowolnych elementw tablicy tab1
moliwe s cztery rne sytuacje:
119
1. Pierwszy argument jest podzielny przez dwa (e1 % 2 rwne 0) i drugi argument
jest rwnie podzielny przez dwa (e2 % 2 rwne 0). W takiej sytuacji naley
sytuacji naley zwrci warto mniejsz od zera, jeli pierwszy argument jest
mniejszy; warto wiksz od zera, jeli drugi argument jest mniejszy; oraz
warto 0, jeli argumenty s rwne. Zapewnia to instrukcja return $e1 - $e2;.
(05-09-12)
119
120
Rysunek 4.14.
Utrata nazw indeksw
po nieprawidowym
sortowaniu tablicy
asocjacyjnej
Aby zatem posortowa tablic asocjacyjn, musimy uy innych funkcji: asort i ksort.
Pierwsza z nich sortuje tablic wzgldem wartoci poszczeglnych kluczy, natomiast
druga wzgldem samych kluczy. Oznacza to, e jeli w skrypcie z listingu 4.15 zamienimy funkcj sort na asort, po sortowaniu uzyskamy kolejno:
tab[indeks9] = 1
tab[indeks5] = 2
tab[indeks1] = 5
tab[indeks3] = 8
Jeli natomiast zamienimy sort na ksort, uzyskamy wynik:
tab[indeks1] = 5
tab[indeks3] = 8
tab[indeks5] = 2
tab[indeks9] = 1
Sortowanie moe si odbywa rwnie w porzdku odwrotnym, czyli od wartoci najwikszej do najmniejszej. Su do tego celu funkcje arsort (sortowanie wzgldem
wartoci) i krsort (sortowanie wzgldem kluczy).
Operacje na elementach
Zmiana kolejnoci elementw
Jeli chcemy odwrci kolejno elementw w tablicy, czyli spowodowa, aby pierwszy sta si ostatnim, drugim przedostatnim itd., moemy zastosowa funkcj array_
reverse. Jako argument tej funkcji naley przekaza nazw tablicy. Tablica ze zmienion
121
Poruszanie si po tablicy
Kada tablica w PHP ma wewntrzny wskanik wskazujcy na jej biecy element.
Po utworzeniu tablicy wskanik ten jest ustawiony na pierwszy element. Podczas wykonywania operacji na elementach tablicy jego pooenie moe si zmienia. Istniej
funkcje, ktre wykorzystuj go do wasnych potrzeb, istnieje rwnie moliwo bezporedniej manipulacji pozycj wskanika przez programist. Jedn z takich funkcji jest
each. Jej zadaniem jest pobranie aktualnego elementu tablicy i przesunicie wskanika
o jedno miejsce w przd. Jeeli wskanik znajdzie si na kocu tablicy, wywoanie each
powoduje zwrcenie wartoci false. Takie dziaanie funkcji each umoliwia zastosowanie jej w ptli while przetwarzajcej elementy tablicy. Naley jedynie pamita, e
wynikiem dziaania each jest w rzeczywistoci czteroelementowa tablica (!), zawierajca cztery klucze: 0, 1, key, value, gdzie 0 i key przechowuj pobrany klucz (indeks),
a 1 i value odpowiadajc mu warto. Obrazuje to poniszy przykad:
<?php
$tab = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
while($val = each($tab)){
echo("val[0] = $val[0] | ");
echo("val[1] = $val[1] | ");
echo("val['key'] = $val[key] | ");
echo("val['value'] = $val[value] ");
echo("<br>");
}
?>
elementu. Jeli aktualn pozycj wskanika tablicy jest jej ostatni element,
funkcja zwraca warto false.
(05-09-12)
121
122
tego elementu.
Oprcz wymienionych wyej funkcji modyfikujcych wewntrzny wskanik istniej
rwnie dwie funkcje pobierajce aktualny element tablicy. S to: current i pos. Przykady wykorzystania tego typu konstrukcji jzyka zostay zaprezentowane na listingu 4.16.
Efekt dziaania skryptu jest natomiast przedstawiony na rysunku 4.15.
Listing 4.16. Wykorzystanie funkcji operujcych na wewntrznym wskaniku tablicy
<?php
$tab = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$val = end($tab);
echo("Wynik dziaania end(\$tab): $val<br>");
prev($tab);
prev($tab);
$val = current($tab);
echo("Po dwukrotnym wykonaniu prev(\$tab) ");
echo("aktualnym elementem jest: $val<br>");
$val = reset($tab);
echo("Po wykonaniu reset(\$tab) aktualnym elementem jest: $val<br>");
next($tab);
next($tab);
$val = current($tab);
echo("Po dwukrotnym wykonaniu next(\$tab) ");
echo("aktualnym elementem jest: $val<br>");
echo("Wynik dziaania ptli while wykonujcej funkcj next: ");
while($val = next($tab))
echo("$val ");
end($tab);
echo("<br>Wynik dziaania ptli while wykonujcej funkcj prev: ");
while($val = prev($tab))
echo("$val ");
?>
123
Rysunek 4.15.
Efekt dziaania
skryptu
wykorzystujcego
funkcje operujce
na wskaniku
tablicy
Kolejny krok to wykonanie funkcji reset, ktra przesuwa wskanik na pocztek tablicy
(a zatem aktualnym elementem staje si komrka o indeksie 0). Po wykonaniu funkcji
reset dwukrotnie wykonywana jest funkcja next, czyli wskanik jest przesuwany
o dwie pozycje do przodu i wskazuje na trzeci element (o indeksie 2). Dalej w kodzie
zostaa umieszczona ptla while przegldajca kolejne elementy tablicy. Wykorzystuje
ona fakt, e funkcja next przesuwa wskanik o jedno miejsce i zwraca warto wskazanego elementu. W przypadku gdy wskanik zostanie przesunity za ostatni element,
funkcja zwraca warto false, co jest warunkiem zakoczenia ptli.
Poniewa po ostatnim wykonaniu funkcji next wskanik tablicy zosta przesunity za
ostatni element, po zakoczeniu ptli jest wykonywana funkcja end, ktra przesuwa go
z powrotem na ostatni element. Dziki temu moe poprawnie zadziaa kolejna ptla
while, ktra wykonuje seri funkcji prev, przesuwajcych wskanik tablicy do tyu, za
kadym wywoaniem o jedn pozycj. Kiedy wskanik znajdzie si przed pierwszym
elementem, wywoanie funkcji prev zwrci warto false i tym samym ptla koczy
dziaanie.
(05-09-12)
123
124
Funkcja zwraca warto okrelajc liczb elementw w powikszonej tablicy. Podobnie do array_push dziaa array_unshift dodaje ona okrelon liczb elementw na
pocztku tablicy. Jeli tablica bya indeksowana numerycznie, zostanie ona rwnie odpowiednio przenumerowana. Wywoanie funkcji array_unshift ma schematyczn posta:
array_unshift($tablica, element1, element2,..., elementn);
Sposb wykorzystania wymienionych funkcji w dziaajcym skrypcie obrazuje kod widoczny na listingu 4.17. Efekt jego dziaania zosta natomiast zaprezentowany na rysunku 4.16.
Listing 4.17. Ilustracja dziaania funkcji modyfikujcych zawarto tablicy
<?php
$tab = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
echo("Pierwotna zawarto tablicy: ");
foreach($tab as $val) echo("$val ");
$val = array_pop($tab);
echo("<br>Wynik pierwszej operacji pop: $val <br>");
$val = array_pop($tab);
echo("Wynik drugiej operacji pop: $val <br>");
echo("Aktualna zawarto tablicy: ");
foreach($tab as $val) echo("$val ");
$val = array_shift($tab);
echo("<br>Wynik pierwszej operacji shift: $val <br>");
$val = array_shift($tab);
echo("Wynik drugiej operacji shift: $val <br>");
echo("Aktualna zawarto tablicy: ");
foreach($tab as $val) echo("$val ");
array_push($tab, 1, 2);
echo("<br>Zawarto tablicy po operacji push: ");
foreach($tab as $val) echo("$val ");
array_unshift($tab, 9, 10);
echo("<br>Zawarto tablicy po operacji unshift: ");
foreach($tab as $val) echo("$val ");
?>
W skrypcie tworzona jest tablica tab, ktra pocztkowo zawiera uporzdkowane rosnco wartoci od 1 do 10. Wykonanie dwch operacji array_pop($tab); powoduje
usunicie dwch ostatnich wartoci, a zatem pozostaj komrki od 1 do 8. Nastpnie s
wykonywane dwie operacje array_shift($tab);, ktre usuwaj dwie pierwsze komrki; tym samym w tablicy pozostaj wartoci od 3 do 8. Naley zwrci uwag, e przenumerowaniu ulegy rwnie indeksy komrek. Warto 3 znajduje si obecnie pod
indeksem 0, warto 4 pod indeksem 1 itd. Kolejn wykonywan operacj jest array_
push($tab, 1, 2);, ktra powoduje dodanie na kocu tablicy dwch komrek, pierwszej
o wartoci 1 i drugiej o wartoci 2. Operacja array_unshift($tab, 9, 10); powoduje
125
(05-09-12)
125
126
Rysunek 4.17.
Efekt dziaania funkcji
array_count_values
W skrypcie zostaa utworzona tablica tab zawierajca zbir liczb. Wykonanie funkcji
array_count_values spowodowao zwrcenie tablicy asocjacyjnej, ktrej zawarto
zostaa wywietlona w przegldarce. Wida wyranie, e warto 1 w oryginalnej tablicy wystpuje cztery razy, warto 2 dwa razy, warto 5 trzy razy, a warto 8
jeden raz.
Obiekty
PHP umoliwia programowanie zorientowane obiektowo (z ang. OOP Object Oriented Programming). Pene zaprezentowanie tego tematu wymagaoby napisania oddzielnej ksiki, zatem na kolejnych stronach zostan przedstawione jedynie podstawowe
koncepcje i ich realizacja w PHP.
Obiekt jest traktowany jako byt programistyczny, ktry moe przechowywa pewne
dane (atrybuty) i wykonywa pewne zadania (funkcje). Nieco upraszczajc to zagadnienie, mona powiedzie, e w obiekcie zawieramy zmienne przechowujce dane oraz
funkcje realizujce przypisanie obiektowi zadania. Zmienne zawarte w obiekcie nazywamy polami obiektu, natomiast funkcje metodami obiektu. Posta obiektu opisuje
konstrukcja nazywana klas. Pola i metody okrelamy natomiast jako skadowe klasy.
Oglna posta klasy to:
class nazwa_klasy
{
//definicja klasy
}
Klasa moe zawiera dowoln liczb zmiennych (pl) oraz funkcji (metod) dowolnego
typu. Nie mona natomiast nada klasie nazwy stdClass, ktra jest zarezerwowana.
Nie naley rwnie rozpoczyna nazw funkcji skadowych od znakw __. Na listingu 4.19 zostaa zaprezentowana przykadowa klasa zawierajca dwa pola i jedn metod.
Listing 4.19. Przykad prostej klasy
<?php
class klasa1
{
var $pole1;
var $pole2;
127
function show()
{
echo("Test...");
}
}
?>
Aby utworzy obiekt tak zdefiniowanej klasy, naley uy operatora new w postaci:
new nazwa_klasy;
Tak powstay obiekt naley przypisa zmiennej, tak aby mona byo si do niego pniej odwoywa. Najczciej stosuje si zatem konstrukcj:
$zmienna = new nazwa_klasy;
Odwoania do skadowych
Dostp do skadowych klasy uzyskujemy stosujc operator ->. Jeli zatem utworzony
zostanie obiekt obj1, dostp do jego pl uzyskujemy dziki konstrukcji:
$obj1->nazwa_pola;
(05-09-12)
127
128
Zosta tu utworzony i przypisany zmiennej obj obiekt klasy klasa1. Nastpnie polu
pole1 tego obiektu zostaa przypisana warto 100, a polu pole2 warto 200. Wykorzystany zosta w tym celu operator ->. Ten sam operator jest uywany do odczytu
zawartoci pl, a take do wywoania funkcji show. Ostatecznie po wykonaniu skryptu
w przegldarce ujrzymy widok jak na rysunku 4.18.
Rysunek 4.18.
Efekt dziaania
skryptu operujcego
na skadowych klasy
Odwoanie this
Osoby, ktre programoway ju w jzykach obiektowych, mog by zaskoczone sposobem dostpu do skadowych klasy wewntrz tej klasy. Zamy, e funkcja show klasy klasa1 z listingu 4.19 miaaby za zadanie wywietli zawarto pl pole1 i pole2.
Mogoby si wydawa, e powinna mie w takim razie nastpujc posta:
function show()
{
echo("pole1 = $pole1, pole2 = $pole2");
}
Przekonajmy si w takim razie, jaki bdzie efekt dziaania skryptu widocznego na listingu 4.21, wykorzystujcego powysz posta funkcji show. Efekt ten jest zaprezentowany na rysunku 4.19. Zapewne nie tego si spodziewalimy!
Listing 4.21. Ilustracja nieprawidowego odwoania do skadowych klasy
<?php
class klasa1
{
var $pole1;
var $pole2;
function show()
{
echo("pole1 = $pole1, pole2 = $pole2");
}
}
$obj = new klasa1;
$obj->pole1 = 100;
$obj->pole2 = 200;
$obj->show();
?>
129
Rysunek 4.19.
Efekt dziaania
skryptu z listingu 4.21
Konstruktory
Konstruktory to specjalne metody, wykonywane podczas tworzenia obiektw danej klasy. Wykorzystywane s do wykonywanie wstpnych zada inicjacyjnych, jak np. przypisanie pocztkowych wartoci polom obiektu. Definicja konstruktora wyglda tak jak
definicja kadej innej metody, z t rnica, e jego nazwa musi by zgodna z nazw
danej klasy, schematycznie:
class nazwa_klasy
{
function nazwa_klasy()
{
//tre konstruktora
}
//pozostae skadowe klasy
}
(05-09-12)
129
130
Dziedziczenie
Jednym z wanych elementw programowania obiektowego jest dziedziczenie, czyli
przejmowanie przez jedn klas waciwoci innej klasy. W PHP dziedziczenie jest wykonywane za pomoc sowa extends. Schematycznie konstrukcja taka ma posta:
class B extends A
{
//skadowe klasy B
}
i oznacza, e klasa B przejmuje wszystkie skadowe klasy A oraz dodaje swoje wasne.
Na listingu 4.23 zosta przedstawiony kod ilustrujcy to zagadnienie.
Listing 4.23. Ilustracja dziedziczenia
<?php
class A
{
var $poleA;
function showA()
{
echo("Funkcja showA klasy A... <br>");
}
}
class B extends A
131
{
var $poleB;
function showB()
{
echo("Funkcja showB klasy B... <br>");
}
}
$obj = new B;
$obj->poleA = 100;
$obj->poleB = 200;
echo("Warto pola poleA obiektu obj = $obj->poleA <br>");
echo("Warto pola poleB obiektu obj = $obj->poleB <br>");
$obj->showA();
$obj->showB();
?>
Powstay tu dwie klasy. Klasa A zawiera jedno pole o nazwie poleA i jedn metod
o nazwie showA. Klasa B zawiera dwie wasne skadowe: pole o nazwie poleB i metod
o nazwie metodaB. Poniewa jednak B dziedziczy z A, zawiera ona rwnie dodatkowo
wszystkie skadowe klasy A. A zatem kady obiekt klasy B bdzie mia w sumie cztery
skadowe:
pole o nazwie poleA,
pole o nazwie poleB,
metoda o nazwie metodaA,
metoda o nazwie metodaB.
Wida to wyranie w dalszej czci skryptu. Powsta tam obiekt obj klasy klasaB,
a jego polom zostay przypisane przykadowe wartoci 100 i 200. Wartoci pl zostay
nastpnie wywietlone w przegldarce. Po wykonaniu tej czynnoci zostay wywoane
dwie metody obiektu obj. Ostateczny wynik dziaania skryptu jest przedstawiony na
rysunku 4.20. To najlepszy dowd, e klasa B odziedziczya waciwoci klasy A.
Rysunek 4.20.
Efekt dziaania
skryptu ilustrujcego
zagadnienie
dziedziczenia
(05-09-12)
131
132
Nie jest dopuszczalna sytuacja, w ktrej jedna klasa dziedziczyaby z wicej ni jednej
klasy. Inaczej mwic zabronione jest, znane np. z C++, wielodziedziczenie.
Przesanianie skadowych
Kiedy wykorzystujemy dziedziczenie klas, prdzej czy pniej napotkamy problem przesaniania skadowych. Chodzi o sytuacj, w ktrej w obu klasach biorcych udzia
w dziedziczeniu wystpuj skadowe o takich samych nazwach. Jak naley interpretowa tak sytuacj? Ot zawsze klasa dziedziczca przesania skadowe klasy dziedziczonej. Innymi sowy jeli klasa B dziedziczy z klasy A i maj skadowe o takich samych
nazwach, to w klasie B bd widoczne tylko jej skadowe. Spjrzmy na listing 4.24,
ktry prezentuje tak wanie sytuacj.
Listing 4.24. Ilustracja przesaniania skadowych
<?php
class A
{
var $pole1;
function show()
{
echo("Funkcja show klasy A... <br>");
}
}
class B extends A
{
var $pole1;
function show()
{
echo("Funkcja show klasy B... <br>");
}
}
$objA = new A;
$objA->pole1 = 100;
$objA->show();
$objB = new B;
$objB->pole1 = 100;
$objB->show();
?>
133
W klasie A zawarte jest pole o nazwie pole1 oraz metoda o nazwie show. Klasa B dziedziczy z klasy A, a wic dziedziczy zawarte w niej skadowe oraz zawiera swoje skadowe. Problem w tym, e maj one takie same nazwy, jak w klasie A, czyli: pole1 i show.
Jak zatem bd zachowyway si obiekty objA klasy A i objB klasy B? W przypadku
obiektu objA dziaanie jest oczywicie standardowe, mona przypisywa i odczytywa
wartoci pola pole1, mona te bez problemu wywoywa metod show. Co jednak
dzieje si z obiektem objB? Skoro klasa B dziedziczy z klasy A, to wydaje si, e powinien on zawiera dwa pola o nazwie pole1 i dwie metody show. I tak jest w istocie!
Ktra metoda zostanie zatem wywoana za pomoc instrukcji $objB->show();? Zgodnie
z zasad przesaniania, przedstawion wyej, bdzie to metoda klasy B. Wszystkie metody klasy A zostay bowiem w klasie B przesonite i nie s bezporednio widoczne
w obiektach klasy B.
Okazuje si jednak, e z wntrza klasy B mona dosta si do ukrytych skadowych
odziedziczonych z klasy A. Suy to tego celu specjalna skadnia wykorzystujca operator zakresu :: i sowo kluczowe parent. Schematycznie takie wywoanie ma posta:
parent::nazwa_pola
dla pl i:
parent::nazwa_metody()
dla metod.
Dziaanie skryptu wykorzystujcego tego typu konstrukcje ilustruje kod widoczny na
listingu 4.25.
Listing 4.25. Dostp do ukrytej skadowej za pomoc operatora ::
<?php
class A
{
function show()
{
echo("Funkcja show klasy A... <br>");
}
}
class B extends A
{
function show()
{
echo("Funkcja show klasy B... <br>");
}
function showA()
{
parent::show();
}
}
$objB = new B;
$objB->show();
$objB->showA();
?>
(05-09-12)
133
134
W klasie A zostaa zdefiniowana tylko jedna metoda o nazwie show; wywietla ona napis
informujcy, z ktrej klasy pochodzi. W klasie B, dziedziczcej z A, znajduje si rwnie funkcja o nazwie show, wywietlajca informacj o klasie, z ktrej pochodzi, oraz
druga funkcja o nazwie showA. W funkcji showA znajduje si instrukcja parent::show();,
ktra wywouje funkcj show z klasy A. Zmienna objB zawiera obiekt klasy B. W tym
obiekcie znajduj si wszystkie wymienione metody. Instrukcja $objB->show(); powoduje, tak jak w poprzednich przykadach, wywoanie funkcji show pochodzcej
z klasy B. Wywoanie $objB->showA(); powoduje wywoanie funkcji showA z klasyB.
Poniewa jednak w funkcji showA znajduje si instrukcja parent::show();, wywoana
zostanie rwnie funkcja show z klasy A.