You are on page 1of 39

IDZ DO

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

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

Szybki rozwj technologii informatycznych wywar wyjtkowo silny wpyw na Internet.


Zmienia si nie tylko szybko transmisji danych i sposoby ich zabezpieczania,
ale rwnie metody tworzenia witryn WWW. Statyczne strony WWW s stopniowo
wypierane przez dynamiczne witryny, pene elementw interaktywnych i artykuw
generowanych w oparciu o bazy danych. Wrd narzdzi i technologii stosowanych
do tworzenia tego typu witryn najwiksz popularnoci ciesz si jzyk
programowania PHP oraz baza danych MySQL. Skrypty stworzone za pomoc PHP
i korzystajce z danych zapisanych w tabelach MySQL-a napdzaj zdecydowan
wikszo dynamicznych witryn WWW.
PHP i MySQL dla kadego to podrcznik opisujcy zasady wykorzystywania tych
dostpnych bezpatnie technologii do tworzenia stron i serwisw WWW. Czytajc go,
nauczysz si instalowa interpreter PHP i baz danych MySQL w rnych systemach
operacyjnych, tworzy skrypty w PHP i czy je z baz danych. Poznasz zasady
programowania w jzyku PHP i sposoby osadzania skryptw w kodzie strony WWW.
Dowiesz si, jak projektowa bazy danych i w jaki sposb wykorzystywa jzyk SQL
do manipulowania zawartymi w nich informacjami. W oparciu o te wiadomoci
stworzysz elementy dynamicznej witryny WWW licznik, mechanizmy autoryzacji
uytkownikw i generowania statystyk, wiadomoci, ankiety, koszyk na zakupy i wiele
innych, w oparciu o ktre bdziesz mg zbudowa wasny serwis WWW oparty na
bazie danych i skryptach PHP.
Instalacja PHP w Windows i Linuksie
Podstawowe wiadomoci o PHP
Instrukcje jzyka PHP
Przetwarzanie danych z przegldarki WWW
Operacje na systemie plikw
Obsuga sesji i plikw cookies
Instalacja i uruchomienie MySQL-a
Tworzenie tabel
Operacje na danych
czenie skryptw z baz danych
Uwierzytelnianie uytkownikw
Tworzenie moduu statystyk
Komponenty dynamicznych witryn WWW
Docz do grona twrcw witryn WWW korzystajcych z PHP i MySQL-a

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

Rozdzia 2. Znaczniki, zmienne i typy danych .................................................... 23


Umieszczanie skryptw w kodzie HTML ...................................................................... 23
Znaczniki kanoniczne (klasyczne) ........................................................................... 23
Znaczniki typu SGML .............................................................................................. 24
Znaczniki typu ASP ................................................................................................. 24
Znaczniki skryptw HTML ...................................................................................... 24
Skrypty zewntrzne ........................................................................................................ 25
Instrukcja include ..................................................................................................... 25
Instrukcja require ..................................................................................................... 26
Wicej o doczaniu plikw ..................................................................................... 27
Komentarze w skryptach ................................................................................................ 28
Komentarz blokowy ................................................................................................. 29
Komentarz jednowierszowy ..................................................................................... 30
Komentarz jednowierszowy uniksowy ..................................................................... 30
Typy danych ................................................................................................................... 30
Typy skalarne ........................................................................................................... 31
Typy zoone ............................................................................................................ 35
Typy specjalne ......................................................................................................... 35
Zmienne ......................................................................................................................... 36
Zmienne w PHP ....................................................................................................... 36
Tworzenie zmiennych .............................................................................................. 36
Jak wykry typ zmiennej? ........................................................................................ 38
Zmienne globalne (superglobalne) ........................................................................... 40
Stae ................................................................................................................................ 42
Stae w PHP ............................................................................................................. 42
Stae predefiniowane ................................................................................................ 42

PHP i MySQL dla kadego


Operatory ....................................................................................................................... 42
Operatory arytmetyczne ........................................................................................... 43
Operatory inkrementacji i dekrementacji ................................................................. 44
Operatory bitowe ...................................................................................................... 47
Operatory logiczne ................................................................................................... 49
Operatory relacyjne .................................................................................................. 51
Operator acuchowy ............................................................................................... 51
Operatory przypisania .............................................................................................. 52
Operatory tablicowe ................................................................................................. 53
Pozostae operatory .................................................................................................. 55
Priorytet operatorw ................................................................................................ 57
Konwersje typw ............................................................................................................ 58
Zmiana typu zmiennej .............................................................................................. 58
Rzutowanie typw .................................................................................................... 59
Funkcje konwersji .................................................................................................... 60
Zasady konwersji ..................................................................................................... 62

Rozdzia 3. Instrukcje sterujce i funkcje .......................................................... 65


Instrukcje warunkowe .................................................................................................... 65
Instrukcja if...else ..................................................................................................... 65
Instrukcja if...else if .................................................................................................. 66
Zagniedanie instrukcji warunkowych ................................................................... 67
Operator warunkowy ...................................................................................................... 71
Instrukcja wyboru switch ............................................................................................... 72
Ptle ................................................................................................................................ 76
Ptla typu for ............................................................................................................ 76
Ptla typu while ........................................................................................................ 80
Ptla typu do...while ................................................................................................. 81
Ptla typu foreach ..................................................................................................... 82
Skadnia alternatywna .................................................................................................... 84
Instrukcje warunkowe .............................................................................................. 84
Instrukcja switch ...................................................................................................... 86
Ptle ......................................................................................................................... 86
Instrukcje break i continue ............................................................................................. 87
Instrukcja break ........................................................................................................ 87
Instrukcja continue ................................................................................................... 89
Funkcje ........................................................................................................................... 91
Budowa funkcji ........................................................................................................ 91
Argumenty funkcji ................................................................................................... 91
Zwracanie wartoci .................................................................................................. 93
Zasig zmiennych .................................................................................................... 94
Argumenty funkcji raz jeszcze ................................................................................. 98

Rozdzia 4. Tablice i obiekty ............................................................................. 103


Tablice .......................................................................................................................... 103
Tablice zwyke ....................................................................................................... 103
Tablice asocjacyjne ................................................................................................ 106
Tablice wielowymiarowe ....................................................................................... 110
Operacje na tablicach ............................................................................................. 116
Obiekty ......................................................................................................................... 126
Odwoania do skadowych ..................................................................................... 127
Odwoanie this ....................................................................................................... 128
Konstruktory .......................................................................................................... 129
Dziedziczenie ......................................................................................................... 130
Przesanianie skadowych ...................................................................................... 132

Spis treci

Rozdzia 5. Przetwarzanie danych z przegldarki .............................................. 135


Metoda GET ................................................................................................................. 136
Metoda POST ............................................................................................................... 140
Wysyanie plikw (upload) .......................................................................................... 141
Odbieranie plikw (download) ..................................................................................... 145
Wysanie pojedynczego pliku ................................................................................ 145
Wysyanie pliku wybieranego z listy ..................................................................... 147
Automatyczne generowanie listy plikw ............................................................... 150
Lista plikw przechowywana w pliku tekstowym .................................................. 152

Rozdzia 6. Cigi znakw, data i czas ............................................................. 157


Cigi znakw ................................................................................................................ 157
Formatowanie cigw ............................................................................................ 159
Porwnywanie cigw ........................................................................................... 167
Przeszukiwanie cigw .......................................................................................... 169
Przetwarzanie cigw ............................................................................................. 170
Data i czas .................................................................................................................... 175
Funkcja checkdate .................................................................................................. 175
Funkcja date ........................................................................................................... 175
Funkcja getdate ...................................................................................................... 177
Funkcja gmdate ...................................................................................................... 178
Funkcja localtime ................................................................................................... 179
Funkcja microtime ................................................................................................. 180
Funkcja mktime ...................................................................................................... 180
Funkcja strftime ..................................................................................................... 181
Funkcja strtotime .................................................................................................... 183
Funkcja time ........................................................................................................... 183

Rozdzia 7. System plikw .............................................................................. 185


Obsuga struktury plikw i katalogw .......................................................................... 185
Odczyt zawartoci katalogu ................................................................................... 185
Tworzenie i usuwanie katalogw ........................................................................... 189
Zmiana katalogu biecego .................................................................................... 189
Odczytywanie informacji o plikach ....................................................................... 190
Miejsce na dysku .................................................................................................... 191
Usuwanie zawartoci katalogu ............................................................................... 193
Nawigacja po katalogach ....................................................................................... 193
Obsuga plikw ............................................................................................................ 195
Otwieranie i zamykanie plikw .............................................................................. 195
Odczyt danych ....................................................................................................... 197
Zapis danych .......................................................................................................... 203
Poruszanie si po danych w pliku .......................................................................... 205
Synchronizacja dostpu .......................................................................................... 206
Wykorzystanie plikw do przechowywania danych ..................................................... 208
Licznik zwyky ....................................................................................................... 208
Licznik graficzny ................................................................................................... 209
Ankieta ................................................................................................................... 211
Logowanie .............................................................................................................. 217
Generowanie listy odnonikw .............................................................................. 219

Rozdzia 8. Cookies i sesje ............................................................................. 223


Cookies ......................................................................................................................... 223
Czym s cookies? ................................................................................................... 223
Jak zapisa cookie? ................................................................................................ 223
Jak odczyta cookie? .............................................................................................. 225
Wykorzystanie cookies .......................................................................................... 226

PHP i MySQL dla kadego


Obsuga sesji ................................................................................................................ 228
Mechanizm sesji ..................................................................................................... 228
Obsuga sesji .......................................................................................................... 229
Uwierzytelnianie z wykorzystaniem mechanizmu sesji ........................................... 236
ledzenie uytkownika ........................................................................................... 241

Rozdzia 9. Podstawy MySQL .......................................................................... 243


Czym jest MySQL? ...................................................................................................... 243
Instalacja i konfiguracja ............................................................................................... 244
Instalacja w systemie Windows ............................................................................. 244
Konfiguracja w systemie Windows ........................................................................ 247
Instalacja w systemie Linux ................................................................................... 250
Zarzdzanie serwerem .................................................................................................. 251
Uruchamianie serwera ............................................................................................ 251
Koczenie pracy serwera ....................................................................................... 253
Narzdzia dodatkowe ................................................................................................... 254
Koncepcja relacyjnych baz danych .............................................................................. 256
Tabele ..................................................................................................................... 256
Klucze .................................................................................................................... 257
Relacje ................................................................................................................... 258
Jak projektowa tabele bazy? ................................................................................. 261
Tworzenie i obsuga baz ............................................................................................... 265
czenie z serwerem .............................................................................................. 265
Tworzenie i usuwanie baz ...................................................................................... 266
Zarzdzanie kontami uytkownikw ...................................................................... 267
Praca z wieloma bazami ......................................................................................... 273
Pobieranie listy baz i tabel ..................................................................................... 273
Kodowanie znakw ................................................................................................ 274
Wczytywanie polece z plikw zewntrznych ....................................................... 277

Rozdzia 10. Podstawy SQL .............................................................................. 279


Czym jest SQL? ........................................................................................................... 279
Tabele ........................................................................................................................... 280
Tworzenie tabel ...................................................................................................... 280
Typy danych w kolumnach .................................................................................... 282
Pobranie struktury tabeli ........................................................................................ 289
Modyfikacja tabel .................................................................................................. 290
Usuwanie tabel ....................................................................................................... 292
Zapytania wprowadzajce dane .................................................................................... 293
Pierwsza posta instrukcji INSERT ....................................................................... 293
Druga posta instrukcji INSERT ............................................................................ 295
Wstawianie wielu wierszy ...................................................................................... 295
Zapytania pobierajce dane .......................................................................................... 296
Pobieranie zawartoci caej tabeli .......................................................................... 297
Sortowanie wynikw .............................................................................................. 297
Pobieranie zawartoci wybranych kolumn ............................................................. 299
Zmiana nazw kolumn w wynikach zapytania ......................................................... 299
Selektywne pobieranie danych ............................................................................... 300
Ograniczanie liczby wierszy w wynikach zapytania .............................................. 304
Zapytania modyfikujce dane ....................................................................................... 305
Zapytania usuwajce dane ............................................................................................ 306
Wstawianie specjalne ................................................................................................... 307

Spis treci

Rozdzia 11. Wicej o SQL ................................................................................ 309


Pobieranie danych z wielu tabel ................................................................................... 309
Zczenia ................................................................................................................ 309
Typy zcze .......................................................................................................... 311
Agregacja (grupowanie) danych ................................................................................... 314
Funkcje statystyczne .............................................................................................. 314
Grupowanie wynikw zapyta ............................................................................... 318
Warunki grupowania .............................................................................................. 320
Funkcje agregujce w zczeniach ......................................................................... 320
Typy tabel ..................................................................................................................... 323
Indeksy ......................................................................................................................... 325
Wizy integralnoci klucze obce ............................................................................. 327
Tworzenie ogranicze ............................................................................................ 327
Dodawanie i usuwanie ogranicze w istniejcych tabelach ................................... 329
Podzapytania ................................................................................................................ 330
Podzapytania proste ............................................................................................... 330
Podzapytania skorelowane ..................................................................................... 332
Podzapytania w klauzuli FROM ............................................................................ 333
Podzapytania w instrukcjach INSERT, UPDATE, DELETE ................................. 334

Rozdzia 12. Tworzenie bazy w praktyce ............................................................ 337


Zaoenia ...................................................................................................................... 337
Diagramy tabel ............................................................................................................. 338
Tworzenie tabel ............................................................................................................ 341
Indeksy i wizy integralnoci ....................................................................................... 348
Baza w praktyce ........................................................................................................... 353

Rozdzia 13. Wsppraca PHP i MySQL ............................................................. 359


Konfiguracja PHP ........................................................................................................ 360
czenie z baz danych ................................................................................................ 361
Koczenie poczenia z baz danych ........................................................................... 362
Wybr bazy .................................................................................................................. 362
Problem polskich liter .................................................................................................. 364
Obsuga zapyta ........................................................................................................... 365
Zapytania typu SELECT ........................................................................................ 366
Zapytania typu INSERT, UPDATE, DELETE ...................................................... 372

Rozdzia 14. Autoryzacje .................................................................................. 377


Proste uwierzytelnianie ................................................................................................ 377
Uwierzytelnianie z wykorzystaniem sesji ..................................................................... 381
Rejestracja nowych uytkownikw .............................................................................. 386

Rozdzia 15. Generowanie statystyk ................................................................. 397


Wstpne zaoenia i struktura danych .......................................................................... 397
Funkcje pomocnicze ..................................................................................................... 399
Cz gwna ............................................................................................................... 407
Generowanie statystyk ................................................................................................. 413

Rozdzia 16. Zarzdzanie kontami uytkownikw ............................................... 427


Rozdzia 17. System news ................................................................................ 447
Rozdzia 18. System zbierania opinii ................................................................. 473
Rozdzia 19. Subskrypcje .................................................................................. 487

PHP i MySQL dla kadego

Rozdzia 20. Forum .......................................................................................... 505


Rozdzia 21. Tworzenie sklepu internetowego ................................................... 527
Gwna cz serwisu .................................................................................................. 527
Logowanie i rejestracja uytkownikw ........................................................................ 535
Funkcje obsugi sklepu ................................................................................................. 544
Wyszukiwanie danych ........................................................................................... 545
Prezentacja szczegowych danych ksiki ........................................................... 550
Obsuga koszyka .................................................................................................... 552
Obsuga zamwie ................................................................................................. 558

Skorowidz ..................................................................................... 565

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

PHP i MySQL dla kadego

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

Do odczytu zawartoci tablicy mona wykorzysta rwnie ptle. S one przydatne


w szczeglnoci wtedy, gdy tablica ma due rozmiary. Na listingu 4.2 zosta przedstawiony skrypt realizujcy takie samo zadanie, jak skrypt z listingu 4.1 (czyli utworzenie tablicy i wywietlenie jej zawartoci), wykorzystujcy jednak ptl typu for.
Listing 4.2. Wykorzystanie ptli for do wywietlenia zawartoci tablicy
<?php
$kolory = array("czerwony", "zielony", "niebieski");
for($i = 0; $i < 3; $i++){
echo("kolory[$i] = $kolory[$i] <br>");
}
?>

Tablica moe zosta rwnie utworzona poprzez bezporednie przypisywanie wartoci jej komrkom. Przykadowo zamiast pisa:
$kolory = array("czerwony", "zielony", "niebieski");

Rozdzia 4. Tablice i obiekty

105

mona wykorzysta seri instrukcji w postaci:


$kolory[0] = "czerwony";
$kolory[1] = "zielony";
$kolory[2] = "niebieski";

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.

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

105

106

PHP i MySQL dla kadego

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']);

Rozdzia 4. Tablice i obiekty

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']

otrzymamy warto odpowiadajc danemu kluczowi. Ten fakt zosta wykorzystany do


wywietlenia zawartoci poszczeglnych kluczy tablicy w przegldarce. Instrukcja echo
($kolory['kolor1']); wywietla zawarto klucza kolor1, instrukcja echo($kolory
['kolor3']) klucza kolor2, a instrukcja echo($kolory['kolor3']) klucza kolor3.
Tym samym na ekranie zobaczymy widok zaprezentowany na rysunku 4.4.
Rysunek 4.4.
Efekt dziaania
skryptu z listingu 4.4

Drugim ze sposobw tworzenia tablicy asocjacyjnej jest uycie skadni z nawiasami


kwadratowymi, podobnie jak miao to miejsce w przypadku tablic indeksowanych numerycznie. Schematycznie taka konstrukcja ma posta:
nazwa_tablicy['nazwa_klucza'] = warto_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']);

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

107

108

PHP i MySQL dla kadego


echo("<br>kolory['kolor2'] = ");
echo($kolory['kolor2']);
echo("<br>kolory['kolor3'] = ");
echo($kolory['kolor3']);
?>

Pierwsza instrukcja tego skryptu powoduje utworzenie tablicy asocjacyjnej o nazwie


kolory oraz umieszczenie w niej klucza o nazwie kolor1, powizanego z cigiem znakw czerwony. Kolejne dwie instrukcje powoduj umieszczenie w istniejcej ju tablicy
dwch kolejnych kluczy: kolor2 i kolor3 oraz przypisanie do nich odpowiadajcym im
wartoci. Zawarto poszczeglnych kluczy tak utworzonej tablicy jest nastpnie wysyana do przegldarki za pomoc serii instrukcji echo.
Do odczytu tablic asocjacyjnych mona, podobnie jak w przypadku tablic klasycznych,
uy ptli. Nie moe by to jednak ptla typu for, gdy nie zdoa ona stwierdzi, jakie
s wartoci kluczy. Dlatego te tablice asocjacyjne s obsugiwane przez ptle typu
foreach (por. rozdzia 3., sekcja Ptla typu foreach). Taka ptla potrafi pobra kolejne
wartoci kluczy; jak to zrobi, obrazuje skrypt z listingu 4.6.
Listing 4.6. Wykorzystanie ptli typu foreach
<?php
$kolory['kolor1'] = "czerwony";
$kolory['kolor2'] = "zielony";
$kolory['kolor3'] = "niebieski";
echo("Zawarto tablicy:<br>");
foreach($kolory as $kolor){
echo($kolor);
echo("<br>");
}
?>

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>");

Rozdzia 4. Tablice i obiekty

109

foreach($kolory as $klucz => $kolor){


echo("kolory['$klucz'] = $kolor");
echo("<br>");
}
?>

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

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

109

110

PHP i MySQL dla kadego

operacje wykonywane s z wartociami kluczy kolor2 i kolor3. Po wykonaniu tych


modyfikacji zawarto tablicy jest ponownie wysyana do przegldarki. Tym samym po
uruchomieniu skryptu na ekranie zobaczymy widok zaprezentowany na rysunku 4.5.
Rysunek 4.5.
Zawarto tablicy
zostaa zmodyfikowana

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

Tworzenie tablic wielowymiarowych


Do tworzenia tablic wielowymiarowych w PHP wykorzystuje si fakt, e pojedyncza
komrka zwykej tablicy jednowymiarowej moe zawiera dane dowolnego typu, a zatem
rwnie inn tablic. Wynika z tego, e tablica dwuwymiarowa to nic innego jak tablica
jednowymiarowa, w ktrej komrkach zawarte zostay inne tablice jednowymiarowe.

Rozdzia 4. Tablice i obiekty

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]

Ten sposb odwoywania si do komrek tablicy jest wykorzystywany w instrukcjach


echo do wywietlenia wszystkich zawartych w niej wartoci w przegldarce (rysunek 4.7).
Rysunek 4.7.
Wywietlenie zwartoci
tablicy dwuwymiarowej

Do odczytu zawartoci takiej tablicy mona rwnie wykorzysta dwie zagniedone


ptle for. Taki sposb jest szczeglnie przydatny wwczas, gdy tablica ma du liczb wierszy i kolumn. Kod z listingu 4.10 obrazuje, jak wykona takie zadanie dla tablicy
powstaej w poprzednim przykadzie.

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

111

112

PHP i MySQL dla kadego

Listing 4.10. Wykorzystanie ptli for do odczytu tablicy


<?php
$tablica = array(
array(1, 2, 3),
array(4, 5, 6)
);
for($i = 0; $i < 2; $i++){
for($j = 0; $j < 3; $j++){
$wart = $tablica[$i][$j];
echo("tablica[$i][$j] = $wart");
echo("<br>");
}
echo("<br>");
}
?>

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.

Rozdzia 4. Tablice i obiekty

113

Rysunek 4.8.
Schematyczna struktura
tablicy trjwymiarowej

Listing 4.11. Skrypt obsugujcy tablic trjwymiarow


<?php
$biblioteka = array(
'rega1' => array
(
array("Autor" =>
"Tytu" =>
"Numer" =>
array("Autor" =>
"Tytu" =>
"Numer" =>
array("Autor" =>
"Tytu" =>
"Numer" =>
),
'rega2' => array
(
array("Autor" =>
"Tytu" =>
"Numer" =>
array("Autor" =>
"Tytu" =>
"Numer" =>
array("Autor" =>
"Tytu" =>
"Numer" =>
),
'rega3' => array
(
array("Autor" =>
"Tytu" =>
"Numer" =>
array("Autor" =>
"Tytu" =>
"Numer" =>
array("Autor" =>
"Tytu" =>
"Numer" =>
)
);

"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")

foreach($biblioteka as $regal_nazwa => $regal){


echo("Rega: $regal_nazwa<br>");
foreach($regal as $ksiazka){
$autor = $ksiazka['Autor'];
$tytu = $ksiazka['Tytu'];
$numer = $ksiazka['Numer'];

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

113

114

PHP i MySQL dla kadego


echo "$autor | $tytu | $numer";
echo("<br>");
}
echo("<br>");
}

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

Rozdzia 4. Tablice i obiekty

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.

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

115

116

PHP i MySQL dla kadego

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,

Rozdzia 4. Tablice i obiekty

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')

gdzie tablica to nazwa tablicy, ktrej elementy bd sortowane, a nazwa_funkcji to


nazwa funkcji dokonujcej porwnania dwch elementw. Ta ostatnia funkcja bdzie
otrzymywaa w postaci argumentw dwa elementy sortowanej tablicy, musi natomiast
zwraca:
warto mniejsz od zera, jeli pierwszy argument jest mniejszy od drugiego;
warto wiksz od zera, jeli pierwszy argument jest wikszy od drugiego;
warto rwn zero, jeli pierwszy argument jest rwny drugiemu;

Zobaczmy, jak to dziaa na konkretnym przykadzie. Napiszemy skrypt, ktry bdzie


sortowa zawarto tablicy przechowujcej liczby cakowite w taki sposb, e najpierw
umieszczone bd wartoci podzielne przez dwa, od najmniejszej do najwikszej, a dopiero po nich wartoci niepodzielne przez dwa, rwnie od najmniejszej do najwikszej.
To zadanie realizuje kod z listingu 4.14.
Listing 4.14. Realizacja niestandardowego sortowania
<?php
function sortuj($e1, $e2)
{
if($e1 % 2 == 0){
if($e2 % 2 == 0){
return $e1 - $e2;

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

117

118

PHP i MySQL dla kadego


}
else{
return -1;
}

}
else{
if($e2 % 2 == 0){
return 1;
}
else{
return $e1 - $e2;
}
}

$tab1 = array(5, 7, 3, 1, 8, 2, 0, 4, 9, 6);


echo("Zawarto tablicy przed sortowaniem: <br>");
foreach($tab1 as $val)
echo("$val ");
echo("<br>");
usort($tab1, 'sortuj');
echo("Zawarto tablicy po sortowaniu: <br>");
foreach($tab1 as $val)
echo("$val ");
?>

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:

Rozdzia 4. Tablice i obiekty

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

zwrci warto mniejsz od zera, jeli pierwszy argument jest mniejszy;


warto wiksz od zera, jeli drugi argument jest mniejszy; lub warto 0,
jeli argumenty s rwne. Zapewnia to instrukcja return $e1 - $e2;.
2. Pierwszy argument jest podzielny przez dwa (e1 % 2 rwne 0), natomiast drugi
argument nie jest podzielny przez dwa (e2 % 2 rne od 0). W takiej sytuacji

argument pierwszy zawsze powinien znale si przed argumentem drugim,


a zatem naley zwrci warto mniejsz od zera. Zapewnia to instrukcja
return -1;.
3. Pierwszy argument nie jest podzielny przez dwa (e1 % 2 rne od 0), a drugi
argument jest podzielny przez dwa (e2 % 2 rwne 0). W takiej sytuacji argument

pierwszy zawsze powinien znale si za argumentem drugim, a zatem naley


zwrci warto wiksz od zera. Zapewnia to instrukcja return 1;.
4. Pierwszy argument nie jest podzielny przez dwa (e1 % 2 rne od 0) i drugi
argument rwnie nie jest podzielny przez dwa (e2 % 2 rne od 0). W takiej

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;.

Sortowanie tablic asocjacyjnych


W przypadku tablic asocjacyjnych nie mona uy zwykej funkcji sort, gdy spowoduje ona utrat kluczy. Moemy si o tym przekona uruchamiajc skrypt widoczny
na listingu 4.15. Zostaa w nim utworzona tablica tab zawierajca cztery klucze z przypisanymi wartociami cakowitymi. Tablica ta zostaa nastpnie posortowana przez
uycie funkcji sort. Zawarto przed sortowaniem i po nim zostaa wywietlona za
pomoc ptli foreach i instrukcji echo. Jak wida na rysunku 4.14, efekt takiego dziaania nie jest zadowalajcy. Co prawda wartoci zostay posortowane, ale jednoczenie
zostay utracone nazwy indeksw.
Listing 4.15. Uycie funkcji sort do sortowania tablicy asocjacyjnej
<?php
$tab = array
(
'indeks1' => 5,
'indeks9' => 1,
'indeks3' => 8,
'indeks5' => 2
);
echo("Zawarto tablicy przed sortowaniem:<br>");
foreach($tab as $key => $val){
echo("tab[$key] = $val");
echo("<br>");
}
sort($tab);
echo("<br>Zawarto tablicy po sortowaniu:<br>");

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

119

120

PHP i MySQL dla kadego


foreach($tab as $key => $val){
echo("tab[$key] = $val");
echo("<br>");
}
?>

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

Rozdzia 4. Tablice i obiekty

121

kolejnoci elementw zostanie zwrcona jako wynik dziaania funkcji, a zawarto


oryginalnej tablicy nie zostanie naruszona. Sposb dziaania funkcji array_reverse obrazuje poniszy fragment kodu:
<?php
$tab1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$tab2 = array_reverse($tab1);
echo("Zawarto tablicy tab1:<br>");
foreach($tab1 as $val){
echo("$val ");
}
echo("<br>Zawarto tablicy tab2:<br>");
foreach($tab2 as $val){
echo("$val ");
}
?>

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>");
}
?>

Funkcje, ktre pozwalaj na bezporedni modyfikacj wewntrznego wskanika tablicy, to:


reset Resetuje wskanik tablicy ustawiajc go na pierwszym elemencie.

Funkcja jednoczenie zwraca warto pierwszego elementu.


next Przesuwa wskanik tablicy na nastpny element i zwraca warto tego

elementu. Jeli aktualn pozycj wskanika tablicy jest jej ostatni element,
funkcja zwraca warto false.

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

121

122

PHP i MySQL dla kadego


prev Przesuwa wskanik tablic na poprzedni element (w stosunku do pozycji

biecej) i zwraca warto tego elementu. Jeli aktualn pozycj wskanika


tablicy jest jej pierwszy element, funkcja zwraca warto false.
end Ustawia wskanik tablicy na jej ostatnim elemencie i zwraca warto

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 ");
?>

Na pocztku skryptu zostaa zadeklarowana tablica tab zawierajca 10 kolejnych liczb


cakowitych. Nastpnie zostaa wykonana operacja end($tab), a jej wynik zosta przypisany zmiennej val. Wartoci tej zmiennej zostaa zatem warto znajdujca si w ostatniej komrce tablicy, czyli 10. W kolejnym kroku zostay wykonane dwie operacje
prev($tab), co oznacza, e wewntrzny wskanik tablicy zosta przesunity o dwie
pozycje do tyu. Przekonujemy si o tym pobierajc aktualny element tablicy ($val =
current($tab);) i wywietlajc go w przegldarce za pomoc instrukcji echo.

Rozdzia 4. Tablice i obiekty

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.

Dodawanie i pobieranie elementw


W PHP istniej wbudowane funkcje, ktre pozwalaj na dodawanie i usuwanie elementw, z pocztku i z koca tablicy. S to: array_pop, array_shift, array_put i array_
unshift. Funkcja array_pop pobiera element znajdujcy si na kocu tablicy i zwraca
jego warto. Tym samym tablica zostaje skrcona o ostatni element. Schematycznie
operacja taka ma posta:
$zmienna = array_pop($tablica);

Podobne zadanie wykonuje array_shift, z t rnic, e usuwany jest pierwszy element.


W tym przypadku, jeeli tablica bya indeksowana numerycznie, wszystkie elementy
zostan przenumerowane, czyli indeks kadego z nich zmniejszy si o jeden.
Funkcja array_push dziaa odwrotnie ni array_pop. Dodaje ona elementy przekazane
w postaci parametru na kocu tablicy. Schematycznie operacj t mona przedstawi jako:
array_push($tablica, element1, element2,..., elementn);

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

123

124

PHP i MySQL dla kadego

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

Rozdzia 4. Tablice i obiekty

125

natomiast dodanie na pocztku tablicy dwch komrek, pierwszej o wartoci 9 i drugiej


o wartoci 10. Ostatecznie tablica zawiera zatem cig wartoci 9, 10, 3, 4, 5, 6, 7 8, 1, 2,
tak jak jest to widoczne na rysunku 4.16.
Rysunek 4.16.
Efekt dziaania
skryptu z listingu 4.17

Ustalanie rozmiaru tablicy


W wielu przypadkach bardzo przydaje si ustalenie rozmiaru tablicy, czyli stwierdzenie, ile zawiera ona elementw. W PHP wykorzystywana jest w tym celu funkcja count
(zamiast count mona rwnie uy sizeof, ktra jest niczym innym jak aliasem dla
count). Jeli zatem zostanie wykonany kod:
$tab = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$rozmiar = count($tab);

w zmiennej rozmiar zostanie zapisana warto 10.


Innym, nieco bardziej skomplikowanym zadaniem jest stwierdzenie, ile razy dana warto wystpuje w tablicy. W PHP istnieje specjalna funkcja, ktra wykonuje to zadanie: array_count_values. Zwraca ona tablic asocjacyjn, ktrej kluczami s wartoci
tablicy oryginalnej, a wartociami kluczy liczba wystpie tych wartoci w tablicy
oryginalnej. Najlepiej zobaczy, jak to dziaa, zapoznajc si z konkretnym przykadem, przedstawionym na listingu 4.18. Efekt jego dziaania zosta zaprezentowany na
rysunku 4.17.
Listing 4.18. Ilustracja dziaania funkcji array_count_values
<?php
$tab = array(1, 2, 5, 1, 5, 1, 5, 1, 8, 2);
$values = array_count_values($tab);
foreach($values as $key => $val){
echo("[$key] => $val <br>");
}
?>

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

125

126

PHP i MySQL dla kadego

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;

Rozdzia 4. Tablice i obiekty

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;

natomiast dostp do metod dziki konstrukcji:


$obj1->nazwa_metody()

Na listingu 4.20 zostao przedstawione, w jaki sposb uzyska dostp do skadowych


klasy klasa1, z listingu 4.19.
Listing 4.20. Ilustracja sposobw dostpu do skadowych klasy
<?php
class klasa1
{
var $pole1;
var $pole2;
function show()
{
echo("Test...");
}
}
$obj = new klasa1;
$obj->pole1 = 100;
$obj->pole2 = 200;
$val = $obj->pole1;
echo("Warto pola pole1 = $val <br>");
echo("Warto pola pole2 = $obj->pole2 <br>");
echo("Wywoanie funkcji show(): ");
$obj->show();
?>

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

127

128

PHP i MySQL dla kadego

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();
?>

Rozdzia 4. Tablice i obiekty

129

Rysunek 4.19.
Efekt dziaania
skryptu z listingu 4.21

Jeli nasza instalacja PHP ma wczon opcj wywietlania komunikatw, zobaczymy


informacj o niezdefiniowanych zmiennych pole1 i pole2. Instrukcja echo rwnie nie
spenia swojego zadania nie wywietlajc wartoci pl obiektu. Dzieje si tak dlatego,
e wystpujce w instrukcji echo("pole1 = $pole1, pole2 = $pole2"); odwoania
$pole1 i $pole2 zostay potraktowane jak odwoania do lokalnych zmiennych funkcji
show o nazwach pole1 i pole2, a nie jak pola klasy klasa1.
Aby wewntrz klasy odwoa si do jej pl, trzeba uy sowa this. Jest to specjalny
wskanik wskazujcy na biecy obiekt. A zatem odwoanie $this->nazwa_pola oznacza pole znajdujce si w aktualnym obiekcie. Std prawidowa posta funkcji show,
wywietlajcej wartoci pl klasy klasa1, to:
function show()
{
echo("pole1 = $this->pole1, pole2 = $this->pole2");
}

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
}

Napiszmy zatem konstruktor dla powstaej w poprzednich przykadach klasy klasa1


i sprawdmy jego dziaanie. Zadaniem tego konstruktora bdzie przypisanie polu pole1
wartoci pocztkowej 100, natomiast polu pole2 wartoci pocztkowej rwnej 200.
Takie czynnoci wykonuje skrypt zaprezentowany na listingu 4.22.

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

129

130

PHP i MySQL dla kadego

Listing 4.22. Wykorzystanie konstruktora do inicjacji pl obiektu


<?php
class klasa1
{
var $pole1;
var $pole2;
function klasa1()
{
$this->pole1 = 100;
$this->pole2 = 200;
}
function show()
{
echo("pole1 = $this->pole1, pole2 = $this->pole2");
}
}
$obj = new klasa1;
$obj->show();
echo("<br>");
$obj->pole1 = 1;
$obj->pole2 = 2;
$obj->show();
?>

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

Rozdzia 4. Tablice i obiekty

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

Dziedziczenie nie musi ogranicza si jedynie do dwch klas. Mona stworzy ca


hierarchi. Przykadowo z klasy B moe dziedziczy klasa C, ktra tym samym bdzie zawieraa wszystkie skadowe klasy A, wszystkie skadowe klasy B oraz wasne
skadowe. Z klasy C moe z kolei dziedziczy klasa D itd. Z jednej klasy moe rwnie
dziedziczy naraz wiele innych klas, czyli np. z klasy X mog dziedziczy jednoczenie klasy Y i Z. Taka konstrukcja miaaby posta:

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

131

132

PHP i MySQL dla kadego


class X
{
//wntrze klasy X
}
class Y extends X
{
//wntrze klasy Y
}
class Z extends X
{
//wntrze klasy Z
}

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();
?>

Rozdzia 4. Tablice i obiekty

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();
?>

D:\PDF\PHP i MySQL dla kadego\04.doc

(05-09-12)

133

134

PHP i MySQL dla kadego

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.

You might also like