Podstawy języka PHP

Transkrypt

Podstawy języka PHP
Podstawy języka PHP
Podstawy języka PHP
1. Zmienne
1.1. Skalary
1.2. Tablice
1.3. Operatory arytmetyczne
1.4. Operatory przypisania
1.5. Operatory warunkowe i porównania
1.6. Pętle
1.7. Dodatkowe informacje o tablicach — tablice asocjacyjne
1.8. Tablice wielowymiarowe
1
Podstawy języka PHP
1. Zmienne
Pojęcie zmiennej znasz już z innych języków programowania (np. JAVA). Przypomnijmy
je jednak — zmienna w programie komputerowym to wielkość przybierająca wartości
przypisane przez algorytm wykonania programu. Mówiąc językiem potocznym — zmienna
jest podręcznym schowkiem, w którym programy komputerowe przechowują różne
wartości potrzebne do poprawnego działania. W nowoczesnych językach programowania
liczba zmiennych jest ograniczona jedynie wielkością pamięci komputera.
Wszystkie zmienne programu są rozróżniane przez swoje nazwy. Dodatkowo języki
kompilowane, takie jak JAVA czy C++, wymagają, aby programista z góry zadeklarował,
jakiego typu wartości będą przechowywane w poszczególnych zmiennych. W językach
tych typ zmiennej nie ulega zmianie przez cały czas wykonania programu. W PHP
korzystanie ze zmiennych zostało maksymalnie uproszczone. Nie przywiązuje się tu
żadnej wagi do tego, jaki rodzaj danych zawiera zmienna. Możesz używać zmiennej do
przechowywania dowolnej wartości, a PHP sam zadba o poprawne jej wykorzystanie.
1.1. Skalary
Perl rozróżnia dwa podstawowe typy danych: skalary i tablice. Skalary służą do
przechowywania pojedynczych elementów. Listy związane są ze zbiorami elementów,
takich jak tablice. Nie trzeba ich w żaden specjalny sposób deklarować. Do utworzenia
zmiennej skalarnej służy znak dolara ("$"), po którym następuje nazwa zmiennej. Musi
ona zaczynać się literą lub znakiem podkreślenia i może zawierać dowolną liczbę liter,
cyfr i podkreśleń. Odróżniane są duże i małe litery ($Abc i $abc są więc rozróżniane).
PHP obecnie obsługuje następujące typy zmiennych skalarnych:
⎯ boolean — typ logiczny,
⎯ integer — liczba całkowita,
⎯ double — liczba rzeczywista,
⎯ string — tekst.
Oto kilka przykładów przypisania wartości do skalarów:
$liczba = 8;
2
Podstawy języka PHP
przypisuje zmiennej $liczba liczbę całkowitą 8. Jak widać znak równości, podobnie jak
w innych językach, oznacza operację przypisania wartości do zmiennej.
$liczba = 3.456;
przypisuje zmiennej $liczba liczbę zmiennoprzecinkową (kropka oddziela część całkowitą
od ułamkowej).
$liczba = 2e-5;
przypisuje zmiennej $liczba liczbę w postaci wykładniczej.
$liczbaosemkowa = 016;
przypisuje zmiennej $liczba liczbę zapisaną ósemkowo (zero na początku).
$liczbaszesnastkowa = 0x3c;
przypisuje zmiennej $liczba liczbę zapisaną szesnastkowo (0x na początku).
Zwróć uwagę, że dowolny język programowania jest językiem międzynarodowym,
dlatego nazwy zmiennych nie powinny zawierać ani białych znaków (spacja, tabulacja),
ani polskich znaków diakrytycznych.
Poza liczbami zmienne mogą przechowywać także dowolne ciągi znaków (łańcuchy). Oto
kilka przykładów tego typu zmiennych:
$lancuch = "Dowolny łańcuch znaków";
przypisuje zmiennej $lancuch ciąg znaków ujęty w cudzysłowy po prawej stronie znaku
równości. Jeżeli chcemy w tekście umieścić cudzysłów, należy poprzedzić go znakiem "\".
To samo dotyczy znaku "$". W celu umieszczenia wewnątrz tekstu znaku "\" należy
napisać "\\". Aby umieścić w tekście znak nowej linii, można użyć sekwencji "\n".
Wewnątrz tekstu można też użyć zdefiniowanych wcześniej zmiennych:
$a=3;
$b="Jakaś wartość";
$c="$a, $b";
3
Podstawy języka PHP
Zmienna $c będzie miała wartość "3, Jakaś wartość".
$lancuch = 'Dowolny łańcuch znaków';
Ta linia programu pozornie wygląda identycznie jak poprzednia, dotycząca zmiennej
$lancuch. Zwróć jednak uwagę, że w miejscu cudzysłowów pojawiły się apostrofy.
Różnicę zobaczymy na przykładzie. Utwórz w głównym katalogu serwera (htdocs) plik
o nazwie wyplata.php i następującej treści:
<html>
<head>
<title>Wyplata</title>
</head>
<body>
<?php
$napis = "Oto moja wyplata";
$wyplata = "5 zl";
$interpretowany = "Otrzymalem $wyplata \n";
echo $interpretowany;
$doslowny = 'Otrzymalem $wyplata';
echo $doslowny;
?>
</body>
</html>
Teraz, korzystając z przeglądarki internetowej, otwórz wcześniej utworzony plik, podając
jego adres, czyli http://localhost/wyplata.php. Okno przeglądarki powinno zawierać
informacje jak na poniższym rysunku.
4
Podstawy języka PHP
Czy widzisz już różnicę między cudzysłowami i apostrofami?
Prześledźmy dokładnie program. Zaczynamy od linii następującej po znaczniku <?php,
czyli od początku kodu PHP. W linii pierwszej przypisujemy zmiennej $napis ciąg znaków
"Oto moja wyplata". Druga linia to przypisanie zmiennej $wyplata ciągu znaków
"5 zl". W trzeciej, zmiennej $interpretowany przypisujemy ciąg znaków "Otrzymalem
$wyplata \n". Czwarta linia wywołuje funkcję echo, w celu wypisania na ekranie
zawartości zmiennej $interpretowany. Na ekranie pojawia się więc napis: Otrzymalem
5 zl. Zastanów się chwilę nad tą linią, mamy w niej aż dwa nowe elementy języka.
Po pierwsze, argumentem funkcji echo wcale nie musi być ciąg znaków zapisany wprost
po słowie echo, może nim być również nazwa zmiennej. W takim przypadku na ekranie
pojawi się zawartość tej zmiennej. Po drugie, zwróć uwagę na sposób, w jaki PHP
traktuje zawartość zmiennej $interpretowany. Przechowuje ona ciąg znaków, w którym
umieszczono nazwę innej zmiennej ($wyplata). Na ekranie nie pojawiła się nazwa tej
zmiennej, lecz jej zawartość!
Zupełnie inaczej sytuacja przedstawia się w liniach piątej i szóstej. Podobnie jak
poprzednio, zmienna $doslowny przechowuje ciąg znaków zawierający nazwę zmiennej
$wyplata. Tym razem jednak wywołanie funkcji echo $doslowny w linii szóstej,
spowoduje wypisanie zawartości zmiennej $dosłowny bez podstawiania wartości zmiennej
$wyplata. Przyczyną różnicy w działaniu obu instrukcji echo jest różnica funkcjonalności
między cudzysłowami i apostrofami. Łańcuch znakowy otoczony apostrofami jest zawsze
5
Podstawy języka PHP
przetwarzany (np. drukowany) bez jakichkolwiek zmian. Łańcuch otoczony cudzysłowami
jest za każdym razem interpretowany, co oznacza, że wszystkie nazwy występujących
w nim zmiennych są zastępowane ich wartościami.
Pozostaje jeszcze wyjaśnić, po co w ciągu znaków zmiennej $interpretowany wstawiono
dziwny symbol "\n". Jest to uniwersalny znak końca linii. Gdyby go nie było, oba napisy
zostałyby wydrukowane w jednej linii, jeden za drugim (sprawdź to samodzielnie,
modyfikując program). Znak specjalny "\n" musi także zostać poprawnie
zinterpretowany, będzie on funkcjonował prawidłowo jedynie w łańcuchach otoczonych
cudzysłowami.
1.2. Tablice
PHP pozwala na grupowanie skalarów. Tablica jest rozbudowanym typem zmiennej
skalarnej, która potrafi przechowywać wiele wartości. Są one przechowywane w bardzo
zwartej formie. Każdy element ma swój indeks, co oznacza, że poszczególne elementy
tablicy są ponumerowane. Pierwszy element ma indeks 0, drugi 1 i tak dalej. Należy
zauważyć, że każdy element tablicy jest wartością skalarną (pojedynczą wartością).
Identyfikator zmiennej tablicowej składa się z trzech części: znaku $, nazwy oraz pary
nawiasów kwadratowych [ ] zawierających indeks elementu tablicy. Nazwa tablicy
podlega identycznym ograniczeniom, co nazwa skalara.
Aby stworzyć tablicę, wystarczy przypisać wartość któremuś z jej pól:
$tablica[0]="wartość pola 0";
$tablica[1]="wartość pola 1";
$tablica[2]="wartość pola 2";
$tablica[3]="wartość pola 3";
$tablica[4]="wartość pola 4";
Jako indeksu można użyć innej zmiennej, np.:
$indeks=5;
$tablica[$indeks]=100;
Można też definiować tablice za pomocą operatora array.
@lancuchy = array('styczeń', 'luty', 'marzec', 'kwiecień');
6
Podstawy języka PHP
definiuje tablicę zawierającą cztery łańcuchy znakowe.
@pusta =array();
definiuje tablicę pustą.
@rozne = array(3.25, 'wtorek', $zmienna, 3+5, 1024);
definiuje tablicę zawierającą pięć elementów o różnych typach.
Pierwszy element tablicy @rozne jest liczbą zmiennoprzecinkową, drugi łańcuchem
znaków, trzeci wartością skalara $zmienna, czwarty wynikiem działania 3 + 5, piąty
liczbą całkowitą. Zwróć uwagę na to, że tablice działają zupełnie podobnie jak w języku
Perl. Języki, takie jak JAVA czy C++ wymagają, aby wszystkie elementy tablicy były tego
samego typu, zadeklarowanego w programie przed pierwszym użyciem i niezmiennego
do końca działania aplikacji. W PHP tablic (podobnie jak skalarów) nie trzeba deklarować
ani definiować. Pierwsze użycie zmiennej jest równoznaczne z automatyczną deklaracją
i definicją. W PHP wprowadzono jeszcze jedno udoskonalenie. Można wstawić element do
tablicy, nie martwiąc się w ogóle numerem indeksu. Następujący zapis:
$tablica[]=999;
doda do tablicy o nazwie $tablica element o wartości 999 i indeksie o jeden większym
od najwyższego indeksu używanego do tej pory w tej tablicy. Dotychczasowe wpisy do
$tablica wskazują, że nowo nadanym indeksem będzie liczba 6. Programiści Perla
bardzo zazdroszczą tego mechanizmu.
Przyjrzyjmy się teraz sposobowi korzystania z wartości zapisanych w tablicach. Każda
z nich ma swój adres, zwany indeksem. Indeksy są liczbami całkowitymi i rozpoczynają
się od zera. To bardzo ważne — pierwszy element tablicy ma indeks zero, a więc piąty
będzie miał indeks 4. Oto przykład poleceń programu, pozwalający na odczyt wybranego
elementu tablicy:
$zmienna = $rozne[1];
przypisuje do skalara $zmienna, wartość zapamiętaną pod indeksem jeden w tablicy
rozne.
7
Podstawy języka PHP
Tablice w PHP, podobnie jak tablice w Perlu, mają jeszcze jedną zaletę. Programista
może w sposób zupełnie dowolny i całkowicie według własnego uznania przyznawać
indeksy do poszczególnych elementów tablic. Nie ma konieczności ciągłej numeracji
indeksów ani wcześniejszego deklarowania rozmiarów tablic. I tak na przykład poniższy
kod:
$liczby = array(2, 18, 9, 16);
$liczby[10] = 15;
$liczby[100] = 20;
początkowo deklaruje czteroelementową tablicę liczby, po czym dodaje do niej dwa
elementy o indeksach 10 i 100. W efekcie powstaje sześcio-, a nie — jak wynikałoby
z numeracji indeksów — stuelementowa tablica. Warto w tym miejscu zadać pytanie, jak
zachowa się program w PHP przy próbie odczytu wartości z nieistniejącego elementu.
Sprawdźmy to na przykładzie:
<html>
<head>
<title>Tablice</title>
</head>
<body>
<?php
$liczby = array(2, 18, 9, 16);
$liczby[10] = 15;
$liczby[100] = 20;
echo $liczby[10];
echo "<BR>";
echo $liczby[222];
echo "<BR>";
echo $liczby[100];
?>
</body>
</html>
W czwartej linii program (przypomnijmy, że linie programu liczymy dopiero od
wystąpienia znacznika <?php ) wyświetla na ekranie wartość elementu tablicy o indeksie
10. W linii piątej przechodzi do nowej linii, aby liczby nie były drukowane jedna za drugą.
Zwróć uwagę, że zamiast znaku \n zastosowano zwykły znacznik <BR>. Jak widać PHP
8
Podstawy języka PHP
doskonale radzi sobie z takimi sytuacjami. W szóstej drukuje element tablicy
o nieistniejącym wcześniej indeksie 222. Kolejne linie to ponownie przejście do nowej linii
i wydruk elementu o indeksie 100. Każdy z poznanych dotychczas języków
deklaratywnych, takich jak JAVA czy C++ w linii szóstej wyświetliłby błąd, polegający na
przekroczeniu rozmiaru tablicy. A co na to PHP? Podobnie jak Perl wyświetli po prostu
wartość pustą.
Dlaczego tak się stało? Wyjaśnienie jest bardzo proste. Wiesz już, że zmiennych w języku
PHP, podobnie jak w Perl, nie trzeba inicjować przed użyciem. W rzeczywistości pierwsze
użycie nazwy zmiennej jest jej automatyczną deklaracją. W momencie deklaracji
zmienna zostaje zainicjowana wartością pustą (NULL). Tak też stało się w naszym
przykładzie. Element tablicy $liczby[222] został zainicjowany w momencie odczytania
tego zapisu przez interpreter, a następnie pusta wartość została przekazana do funkcji
drukującej echo(). Efekt już znasz — na ekranie pojawiła się pusta linia.
Jak widzisz, tablice są proste w zastosowaniu i bardzo wygodne. Nie musisz nic
deklarować, podajesz nazwę i stosujesz je praktycznie bez ograniczeń. Praktycznie, gdyż
istnieje jedno ograniczenie, za które PHP, tak jak Perl, jest krytykowany: tablice w PHP
są jednowymiarowe!
Istnieją rozwiązania pozwalające na tworzenie bardziej zaawansowanych struktur (tablice
złożone z tablic), ale ich zastosowanie nie jest już tak proste i oczywiste. Nie
przywiązujmy jednak zbyt wielkiej wagi do tego ograniczenia. W 95% programów, które
chciałbyś napisać w PHP, nie będzie Ci ono w ogóle przeszkadzać.
9
Podstawy języka PHP
1.3. Operatory arytmetyczne
Podstawowymi operacjami wykonywanymi w prawie każdym programie są operacje
arytmetyczne. W PHP operatory arytmetyczne są identyczne z operatorami stosowanymi
w innych językach oprogramowania, dlatego też ograniczę się jedynie do ich wymienienia
w treści przykładu. Aby zapoznać się z operatorami, przeanalizuj i uruchom następujący
kod:
<html>
<head>
<title>Operatory</title>
</head>
<body>
<?php
echo "OPERATORY ARYTMETYCZNE<BR>";
$a = 20;
$b = 6;
echo "zmienna a = $a, ";
echo "zmienna b = $b <BR>";
echo "Dodawanie: $a + $b = ";
echo $a + $b;
echo "<BR>";
echo "Odejmowanie: $a - $b = ";
echo $a - $b;
echo "<BR>";
echo "Mnozenie: $a * $b = ";
echo $a * $b;
echo "<BR>";
echo "Dzielenie: $a / $b = ";
echo $a / $b;
echo "<BR>";
echo "Modulo (reszta z dzielenia): $a % $b = ";
echo $a % $b;
echo "<BR>";
$a = $a.$b;
echo $a;
?>
</body>
</html>
10
Podstawy języka PHP
W programie zostały wykorzystane jedynie wiadomości omawiane na wcześniejszych
stronach kursu, nie powinieneś mieć więc żadnych problemów z jego przeanalizowaniem.
Zwróć jedynie uwagę na różnicę między znakami "/" i "\". Pierwszy jest operatorem
dzielenia, drugi — definiuje następujący po nim znak jako znak specjalny
(np. \n — koniec linii).
1.4. Operatory przypisania
Dobrym uzupełnieniem operatorów arytmetycznych są operatory przypisania.
Przedstawię je w postaci tabeli:
Operator
=
Przykład
$a = 5
Opis
przyporządkuj prawą
Zwykły zapis
$a = 5
stronę lewej stronie
+=
$a += 5
dodaj prawą stronę
$a = $a + 5
do lewej strony
-=
$a -= 6
odejmij prawą stronę
$a = $a - 6
od lewej strony
*=
$a *= 7
pomnóż lewą stronę
$a = $a * 7
przez prawą stronę
/=
$a /= 8
podziel lewą stronę
$a = $a / 8
przez prawą stronę
%=
$a %= 9
przyporządkuj lewej
$a = $a % 9
stronie resztę z
dzielenia lewej strony
przez prawą
.=
$a .= 10
przyporządkuj lewej
$a = $a.10
stronie wynik
połączenia łańcuchów
prawej i lewej strony
Wpisz do swojego edytora następujący program, zapisz w głównym katalogu serwera
(HTDOCS) jako plik o nazwie przypisanie.php, a następnie, korzystając z przeglądarki
internetowej, otwórz wcześniej utworzony plik, podając jego adres, czyli
http://localhost/przypisanie.php.
11
Podstawy języka PHP
<html>
<head>
<title>Przypisanie</title>
</head>
<body>
<?php
echo "OPERATORY Przpisania<BR>";
$a = 20; $b = 6;
echo "zmienna a = $a, ";
echo "zmienna b = $b <BR>";
echo 'Dodawanie: $a += $b ';
$a += $b;
echo $a."<BR>";
$a = 20; $b = 6;
echo 'Odejmowanie: $a -= $b ';
$a -= $b;
echo $a."<BR>";
$a = 20; $b = 6;
echo 'Mnozenie: $a *= $b ';
$a *= $b;
echo $a."<BR>";
$a = 20; $b = 6;
echo 'Dzielenie: $a / $b = ';
$a /= $b;
echo $a."<BR>";
$a = 20; $b = 6;
echo 'Modulo (reszta z dzielenia): $a %= $b ';
$a %= $b;
echo $a."<BR>";
$a = 20; $b = 6;
echo 'Konkatenacja: $a .= $b ';
$a.=$b;
echo $a;
?>
</body>
</html>
Jeżeli wszystko wykonałeś prawidłowo, powinieneś osiągnąć następujący efekt:
12
Podstawy języka PHP
Warto zapamiętać i dobrze zrozumieć te operatory. Programiści wszelkich języków
skryptowych, a więc także PHP często ich używają, podobnie jak operatorów
inkrementacji i dekrementacji. Ich działanie znasz z pewnością z JAVY lub Perla, dlatego
zamieszczona tu zostanie tylko krótka tabelka przypominająca ich działanie:
++$a
zwiększ $a o 1 i zwróć wartość
$a++
zwróć wartość, po czym zwiększ $a o 1
--$a
zmniejsz $a o 1 i zwróć wartość
$a--
zwróć wartość, po czym zmniejsz $a o 1
Powróćmy na chwilę do programu prezentującego operatory przypisania. Występują
w niej instrukcje:
echo $a."<BR>";
Kropka w powyższym zapisie oznacza oczywiście połączenie łańcuchów. Warto jednak
podkreślić, że funkcja echo pozwala na pracę z wieloma argumentami oddzielonymi
przecinkami. Powyższą linię można więc zapisać w sposób następujący:
echo $a, "<BR>";
W programie można dostrzec jeszcze jedną nowość. Popatrz na linię:
13
Podstawy języka PHP
$a = 20; $b = 6;
Powstała ona przez połączenie dwóch linii. Często przyzwyczajamy się, że średnik
powinien być ostatnim znakiem linii, podczas gdy powinien on być zawsze ostatnim
znakiem instrukcji! Krótsze instrukcje warto grupować w jednej linii, oddzielając je
właśnie średnikami.
1.5. Operatory warunkowe i porównania
Jednym z podstawowych elementów działania algorytmu każdego programu
komputerowego jest ustalanie zależności między dwiema wartościami. Operatory
warunkowe znasz już zapewne z innych języków programowania. Najprostszym
operatorem warunkowym jest if, przeprowadzający test na prawdziwość jakiegoś
wyrażenia. Zanim przedstawię przykład, kilka słów o testowaniu wyrażeń. Warto
poruszyć ten temat, gdyż PHP jest pod tym względem bardzo wdzięcznym narzędziem.
Testowanie dwóch wartości oparte jest na tzw. operatorach porównania. Wymieniłem je
wszystkie w tabeli:
Przykład
$a == $b
$a
Nazwa
Równy
=== Identyczny
$b
Opis
TRUE jeśli $a jest równe $b
TRUE jeśli $a jest równe $b, i obydwa operandy są tego
samego typu (tylko w PHP 4)
$a != $b
Różny
TRUE jeśli $a nie jest równy $b
$a <> $b
Różny
TRUE jeśli $a nie jest równy $b
$a
!== Nie identyczny
$b
TRUE jeśli $a nie jest równy $b, lub nie są tego samego typu
(tylko w PHP 4)
$a < $b
Mniejszy niż
TRUE jeśli $a jest mniejszy od $b
$a > $b
Większy niż
TRUE jeśli $a jest większy od $b
$a <= $b
Mniejszy lub
TRUE jeśli $a jest mniejszy lub równy $b
równy
$a >= $b
Większy lub
TRUE jeśli $a jest większy lub równy $b
równy
14
Podstawy języka PHP
Wszystkie przedstawione w tabeli operatory są dwuargumentowe, a ich działanie jest
doskonale znane. Jest jeszcze jeden operator, tym razem trzyargumentowy, jest to
operator "?:", działający tak jak w C i wielu innych językach.
Oto jego składnia:
(expr1) ? (expr2) : (expr3);
Wartością zwracaną przez operator (wyrażenie) jest expr2, jeśli expr1 jest równe TRUE
lub expr3, jeśli expr1 jest równe FALSE.
Powróćmy jednak do operatorów warunkowych, przedstawię kilka przykładów. Na
początek najprostszy if:
<html>
<head>
<title>If</title>
</head>
<body>
<?php
# wprowadzanie wartosci zmiennych
$a = 100;
$b= 10;
#sprawdzanie zaleznosci pomiedzy wprowadzonymi liczbami
if ($a == $b)
{
#ta instrukcja zostanie wykonana gdy wartosci liczbowe $a i
#$b sa równe
print " $a i $b sa rowne\n";
}
elseif ($a > $b)
{
#ta instrukcja zostanie wykonana gdy wartosc liczbowa $a
#jest wieksza od wartosci liczbowej $b
print " $a jest wieksze od $b \n";
}
else
{
#ta instrukcja zostanie wykonana gdy wartość liczbowa $a
#jest mniejsza od wartości liczbowej $b
print " $a jest mniejsze od $b \n";
15
Podstawy języka PHP
}
?>
</body>
</html>
Uruchom ten program, zmieniając wartości liczb przypisanych do zmiennych $a i $b.
Wszystko zachowuje się zgodnie z oczekiwaniami. W tekście umieszczono komentarze
ułatwiające zrozumienie kodu. Konstrukcja if-else działa podobnie jak w innych
językach. W programie pojawiła się jednak nowość, popatrz na polecenie:
print " $a i $b sa rowne\n";
Zamiast omawianej dotychczas instrukcji echo, zastosowałem instrukcję print, znaną
wszystkim programującym w Perlu. Okazuje się jednak, że program działa prawidłowo.
To wyraźny ukłon w kierunku wymiany programów pomiędzy technologiami. Najczęściej
stosowaną instrukcją w programowaniu internetowym jest wysyłanie ciągów znakowych
do przeglądarki, a do tego służy właśnie echo i print. Dla większości programistów
różnica pomiędzy tymi instrukcjami nie istnieje, echo jest prawdopodobnie trochę
szybsza. Poza jedną różnicą (w Perlu opcję warunkową zapisujemy elsif, a w PHP elseif)
powyższy program można więc uruchomić zarówno w Perlu, jak i w PHP.
Operatory porównania nie są w testach warunkowych obowiązkowe. Zapis ($a) jest
całkowicie poprawny w PHP i oznacza sprawdzenie, czy zmienna $a istnieje, czy ma
zdefiniowaną wartość i czy ta wartość nie jest łańcuchem pustym ani zerem.
Ważne: warto zapamiętać, że w PHP każda forma danych skalarnych, posiadająca
zdefiniowaną wartość różną od zera i łańcucha pustego, jest uważana za prawdę.
Pozostałe operatory warunkowe tworzą już struktury zwane pętlami, przyjrzyjmy się im
dokładnie.
1.6. Pętle
while
Podstawowym zadaniem pętli jest wielokrotne wykonywanie bloków instrukcji.
Najpopularniejsza z instrukcji wykonujących pętle to while. Działanie while polega na
wykonywaniu bloku instrukcji tak długo, jak długo wyrażenie testujące (przypomnijmy —
16
Podstawy języka PHP
to ten tekst w nawiasach okrągłych bezpośrednio za poleceniem while) zwraca prawdę.
Wyrażenie testujące jest sprawdzane zawsze przed wykonaniem pierwszego polecenia
bloku (przed aktywowaniem pętli). Dla lepszego zrozumienia działania pętli uruchom
poniższy program dwa razy:
⎯ pierwszy — dokładnie taki, jak na ekranie,
⎯ drugi — zmieniając wartość początkową $b na 10.
<html>
<head>
<title>Przypisanie</title>
</head>
<body>
<?php
$a = 10;
$b= 20;
echo "<BR> wprowadzono liczby $a i $b<BR>";
while ($a > $b) {
echo " $a jest większe od $b <BR>";
++$b;
}
echo " $a jest równe $b <BR>";
?>
</body>
</html>
Przedstawiony przykład ilustruje co prawda funkcjonowanie pętli while, ma jednak dosyć
poważną wadę (uwidacznia się ona przy uruchomieniu ze zmienioną wartością $b). Nie
jest mianowicie odporny na wprowadzenie przez użytkownika wartości zmiennej $b
większej od wartości zmiennej $a. Uruchomienie go na przykład z wartościami $a = 10
i $b = 20 generuje zastanawiający wynik:
17
Podstawy języka PHP
Spróbuj samodzielnie usunąć omówioną wadę. Zmodyfikuj przedstawiony program tak,
aby zawsze prawidłowo wyświetlał komunikat o wyniku porównania dwóch liczb. Dla
wykonania tego zadania skorzystaj z omówionego na początku tego rozdziału operatora
if-else.
Warto także zapamiętać zasadę: między nawiasami klamrowymi { } każdej instrukcji,
np. pętli while, możemy umieścić dowolnie długi ciąg instrukcji języka PHP. Ta zasada
obowiązuje w dowolnym miejscu programu.
do-while
Pętla do-while zachowuje się bardzo podobnie do pętli while, z wyjątkiem tego, że
wartość wyrażenia logicznego sprawdzana jest na końcu iteracji, a nie na początku.
Wynikającą z tego główną różnicą jest to, że pierwsza iteracja w pętli do-while na pewno
zostanie wykonana (gdyż wyrażenie logiczne będzie sprawdzone dopiero na koniec
iteracji). Natomiast w pętli while, gdzie wyrażenie logiczne jest sprawdzane na początku
iteracji, może dojść do sytuacji, że pętla w ogóle nie zostanie wykonana, jeśli to
wyrażenie będzie miało wartość FALSE od początku.
Pętla do-while ma tylko jeden rodzaj składni:
$i = 0;
do {
print $i;
} while ($i>0);
Powyższa pętla zostanie wykonana tylko raz, gdyż po pierwszej iteracji wartość
wyrażenia logicznego wynosić będzie FALSE ($i nie jest większe od 0) i pętla zostanie
zakończona.
18
Podstawy języka PHP
for
Pętla for jest najczęściej używana w przypadku, gdy musimy wykonać fragment kodu
określoną liczbę razy. Daje ona możliwość określenia liczby iteracji pętli. Jej partia
warunkowa jest bardziej złożona od pętli while i składa się z trzech części.
for
(ustawienie
licznika
pętli;
sprawdzenie
licznika
pętli;
zwiększenie lub zmniejszenie licznika pętli)
{ wykonaj blok instrukcji }
W pętli for wprowadzono koncepcję licznika pętli. Jest to zmienna używana do zliczania
liczby przebiegów pętli (liczba iteracji), wykorzystywana do przerwania wykonywania
pętli, gdy jej wartość przekroczy założoną liczbę. Trzecia część wyrażenia warunkowego
zapewnia zmianę wartości licznika pętli przy każdym przebiegu pętli. Te trzy części
pozwalają na tworzenie dosyć skomplikowanych warunków i pętli. Żadna z części
warunku nie jest obowiązkowa, co zilustrują poniższe przykłady (celem oszczędności
miejsca, pominięta została część kodu obejmująca znaczniki HTML).
Przykład 1 — pętla for z trzema argumentami
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
Przykład 2 — pętla for bez warunku sprawdzającego
for ($i = 1;;$i++) {
if ($i > 10) {
break;
}
print $i;
}
W przykładzie tym pojawiła się nowa instrukcja: break. Po jej napotkaniu program
wychodzi z bieżącej pętli. Należało ją zastosować, gdyż pominięto warunek sprawdzający,
a pętla bez tego warunku jest przecież pętlą nieskończoną. Oprócz instrukcji break,
w języku PHP istnieje bardzo podobna w działaniu instrukcja continue. Po napotkaniu tej
instrukcji program przechodzi wprost do zamykającej klamry i pętla jest kontynuowana.
Instrukcja ta nie powoduje więc całkowitego opuszczenia pętli, a jedynie przejście do
kolejnej iteracji.
19
Podstawy języka PHP
Przykład 3 — pętla, w której pominięto wszystkie argumenty
$i = 1;
for (;;) {
if ($i > 10) {
break;
}
print $i;
$i++;
}
Zwróć uwagę, że przy pomijaniu któregokolwiek z argumentów pętli for należy zachować
odpowiednią liczbę średników oddzielających!
Przykład 4 — pętla, w której instrukcja wykonująca znajduje się w argumencie trzecim
for ($i = 1; $i <= 10; print $i, $i++);
Jak widać, każdy z argumentów może zawierać kilka instrukcji, muszą one być
pooddzielane przecinkami.
Można teraz podać bardziej ogólną definicję składni tej pętli. Oto ona:
for (wyrażenie1; wyrażenie2; wyrażenie3)
{instrukcje}
Wyrażenie1 jest wykonywane tylko raz, na początku pętli. Po czym — na początku
każdej nowej iteracji — obliczana jest wartość logiczna wyrażenia wyrażenie2. Jeśli
wynikiem obliczenia jest TRUE, to pętla kontynuuje i następuje wykonanie instrukcji
umieszczonych w pętli. Jeśli jednak wyrażenie ma wartość FALSE, to wykonanie pętli
zostaje przerwane. Na końcu każdej iteracji zostaje wykonane wyrażenie3.
1.7. Dodatkowe informacje o tablicach — tablice asocjacyjne
Zanim omówię kolejne struktury pętli, warto poświęcić trochę czasu na zapoznanie się
z dodatkowymi możliwościami tablic. Poznasz teraz specjalny typ tablic, tzw. tablice
asocjacyjne. Zostały one zaprojektowane dla łatwiejszego przetwarzania danych
20
Podstawy języka PHP
tekstowych. Ich cechą charakterystyczną jest zastąpienie tradycyjnych indeksów
liczbowych łańcuchami znakowymi. Dzięki tablicom asocjacyjnym można wykorzystywać
w programie listy zawierające pary wartości "klucz" Ù "wartość". Mówiąc inaczej:
tablica asocjacyjna jest niczym innym, jak specyficznym rodzajem tablicy, w którym
zamiast indeksu, który określał poszczególne elementy, użyty jest identyfikator tekstowy,
zwany kluczem. Podstawowa konstrukcja definiująca tablicę asocjacyjną wygląda
następująco:
array( klucz => wartość, klucz => wartość, ...)
Przykładowa definicja tablicy może wyglądać następująco:
$asocjacja = array( 1 => 'jeden', 2 => 'dwa', 3 => 'trzy' );
W języku PERL nazwy skalarów rozpoczynają się od znaku $, nazwy tablic od @,
natomiast tablic asocjacyjnych od %. W PHP nie ma takiego rozróżnienia, wszystkie nazwy
rozpoczynają się od znaku "$", a rozróżnienie następuje po typie indeksu (czy jest to
liczba, czy ciąg znaków). Co ciekawe, reprezentacja tablic w PHP pozwala na dowolne
mieszanie typów indeksów. Zilustruję to przykładem:
$a = array( 'kolor' => 'żółty',
'stolica' => 'warszawa',
'uczelnia' => 'uniwersytet',
'nazwa'
4
=> 'jabłko',
// kluczem będzie 0
);
// znaczy dokładnie to samo, co to:
$a['kolor'] = 'żółty';
$a['stolica'] = 'warszawa';
$a['uczelnia'] = 'uniwersytet';
$a['nazwa'] = 'jabłko';
$a[]
= 4;
// kluczem będzie 0
Można też zwykłe tablice zapisywać w konwencji tablic asocjacyjnych.
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
21
Podstawy języka PHP
// znaczy to samo co: array( 0 => 'a' , 1 => 'b' , 2 => 'c' ),
// albo prościej: array('a', 'b', 'c')
1.8. Tablice wielowymiarowe
Na początku omawiania tablic przedstawiałem ich jednowymiarowość jako często
podkreślaną wadę języka. Zobaczmy więc, jak sobie radzić z implementacją tablic
wielowymiarowych.
Elementy tablicy mogą być danymi dowolnego typu. Oprócz liczb i łańcuchów
w elementach tablicy można umieszczać inne tablice. Tablice zawarte w innych tablicach
są też zwane tablicami wielowymiarowymi. Wyobraźmy sobie tabelę 10 na 10. Tworzy
ona 100 pól, z których każde może mieć swoją wartość. Jednym ze sposobów
reprezentacji takiej struktury w kodzie jest tablica dwuwymiarowa: dziesięcioelementowa
tablica, której każdy element jest dziesięcioelementową tablicą — innymi słowy dziesięć
kolumn i dziesięć wierszy.
Aby wskazać pojedynczy element, należy w nawiasach kwadratowych podać pierwszy
wymiar (wiersz), a następnie w kolejnych nawiasach kwadratowych podać drugi wymiar
(kolumnę). Wskazanie 3 wiersza i 7 kolumny można zapisać jako $jakasTablica[3][7].
Oto przykład obrazujący fakt, że tablice wielowymiarowe są po prostu tablicami tablic.
$miasta = array("Wielkopolska"=>array(
"Poznań",
"Piła",
"Jarocin"
),
"Śląsk"=>array(
"Katowice",
"Chorzów"
)
);
print($miasta["Wielkopolska"][1]);
Jak widać nie jest to jednak tak skomplikowane, jak pierwotnie wyglądało.
22
Podstawy języka PHP
foreach
Dokładna analiza ostatniej linii przedstawionego przed chwilą programu pozwala
zauważyć, że nie znamy do tej pory mechanizmu, pozwalającego w łatwy sposób
wyświetlić wszystkie elementy tablicy. Można to oczywiście wykonać za pomocą pętli for,
ale w przypadku tablic o nieciągłych indeksach uzyskalibyśmy bardzo dużo wartości
pustych. Z tego właśnie powodu twórcy języka Perl zaprojektowali specjalny operator
pętli, wykonującej się automatycznie dla wszystkich elementów tablicy podanej jako
argument. Nosi on nazwę foreach. Istnieją dwie składnie tej konstrukcji, przy czym
druga jest mniej ważnym, lecz użytecznym rozszerzeniem pierwszej:
foreach(wyrażenie_tablicowe as $wartość) wyrażenie
foreach(wyrażenie_tablicowe as $klucz => $wartość) wyrażenie
Pierwsza odmiana iteruje wewnątrz tablicy podanej w wyrażenie_tablicowe. Przy każdej
iteracji, wartość aktualnego elementu tablicy jest przypisywana do zmiennej $wartość,
a wewnętrzny wskaźnik tablicy jest przesuwany o jeden (więc w następnej iteracji
przypisany zostanie kolejny element tablicy).
Druga odmiana działa tak samo jak pierwsza, przy czym klucz aktualnego elementu
tablicy zostanie przypisany do zmiennej $klucz w każdej iteracji. Pozwala to na łatwą
obsługę tablic asocjacyjnych.
Możemy teraz zmodyfikować nasz program dotyczący tablic wielowymiarowych tak, aby
wyświetlał wszystkie wartości tablicy. Oto zmodyfikowana wersja:
<html>
<head>
<title>foreach</title>
</head>
<body>
<?php
$miasta = array("Wielkopolska"=>array(
"Poznań",
"Piła",
"Jarocin"
),
"Slask"=>array(
"Katowice",
"Chorzów"
23
Podstawy języka PHP
)
);
foreach ($miasta as $klucz=>$region){
foreach ($region as $miasto){
echo $klucz,"---",$miasto,"<BR>";
}
}
?>
</body>
</html>
Zastosowano w nim dwie pętle foreach. Pierwsza wykonuje się dla wszystkich wartości
tablicy $miasta. Pobiera więc ona wartości Wielkopolska i Slask. Druga, wewnętrzna
pętla, operuje na tablicach wewnętrznych, zawierających nazwy miast. Jeżeli wszystko
przepisałeś prawidłowo, w oknie przeglądarki powinien wyświetlić się następujący obraz:
I jeszcze dwa przykłady ilustrujące działanie pętli foreach:
Przykład 1 — tablica liczbowa
$a = array (1, 2, 3, 17);
foreach ($a as $v) {
print "Aktualna wartość \$a: $v.\n";
}
24
Podstawy języka PHP
Przykład 2 — tablica asocjacyjna
$a = array (
"jeden" => 1,
"dwa" => 2,
"trzy" => 3,
"siedemnaście" => 17
);
foreach($a as $k => $v) {
print "\$a[$k] => $v.\n";
}
switch
Alternatywą dla omówionej wcześniej struktury if-elseif-else jest instrukcja switch,
która działa na zasadzie porównywania pojedynczego wyrażenia do szeregu możliwych
jego wartości. Aby wyjaśnić działanie tej instrukcji, zaprezentuję dwa przykłady. Pierwszy
z nich to klasyczna konstrukcja if-else, drugi to równoważna instrukcja switch.
Przykład 1
if ($i == 0) {
print "i jest równe 0";
} elseif ($i == 1) {
print "i jest równe 1";
} elseif ($i == 2) {
print "i jest równe 2";
}
Przykład 2
switch ($i) {
case 0:
print "i jest równe 0";
break;
case 1:
print "i jest równe 1";
break;
case 2:
25
Podstawy języka PHP
print "i jest równe 2";
break;
}
Instrukcja switch jest wykonywana linia po linii. Na początku żaden fragment kodu nie
jest wykonywany. Dopiero kiedy zostaje odnalezione wyrażenie case, którego wartość
odpowiada wyrażeniu przy instrukcji switch, PHP rozpoczyna wykonywanie kodu od
miejsca, gdzie znajduje się ta instrukcja case. PHP wykonuje instrukcje aż do momentu,
kiedy blok switch się skończy lub do momentu znalezienia instrukcji break.
Ważne: jeśli nie napiszesz instrukcji break na końcu instrukcji w danym wyrażeniu case,
to PHP będzie wykonywać dalej instrukcje z następnego wyrażenia case.
Po etykiecie case mogą nie występować żadne instrukcje, co oznacza po prostu, że
sterowanie zostaje przekazane do następnej etykiety case.
Na przykład:
switch ($i) {
case 0:
case 1:
case 2:
print "i jest mniejsze od 3, ale nie jest ujemne";
break;
case 3:
print "i jest równe 3";
}
Switch posiada też specjalną etykietę, tzw. etykietę warunku domyślnego — default.
Etykieta ta dotyczy sytuacji, w której wyrażenie nie pasowało do wartości przy innych
etykietach typu case. W instrukcji switch ta etykieta powinna być ostatnia z listy. Na
przykład:
switch ($i) {
case 0:
print "i jest równe 0";
break;
case 1:
26
Podstawy języka PHP
print "i jest równe 1";
break;
case 2:
print "i jest równe 2";
break;
default:
print "i jest różne od 0, 1 i 2";
}
27