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