Programy komputerowe nie są prostymi zbiorami instrukcji wykonywanych jedna po drugiej. Musi istnieć sposób na warunkowe wykonanie niektórych instrukcji, a także często na wielokrotne wykonanie pewnych fragmentów programu. Aby zapewnić taka funkcjonalność, niemal każdy język programowania dostarcza programiście zbiór struktur sterujących.
Struktury sterujące można podzielić na dwie grupy:
1) konstrukcje warunkowe:
- instrukcje warunkowe if,
- instrukcja switch,
- ternariusz – operator trójargumentowy: ? : ;.
2) petle:
- for,
- while,
- do..while,
- foreach
Operatory porównania
Operatory porównania dostępne w PHP wykorzystywane
sa przez znaczna cześć konstrukcji,
a ich znajomość jest niezbędna.
Jak widać w tabeli 1, operatory są dość intuicyjne.
Wyjaśnienia wymaga === oraz !==.
Poza sprawdzaniem wartości przechowywanych
w zmiennych porównują one także typ tych
zmiennych. Najłatwiej zademonstrować to na
prostym przykładzie:
Instrukcja (int) wymusza konwersje wyniku
działania do typu integer (czyli do liczby całkowitej).
Jest to konieczne, aby po wyświetleniu obliczonej
wartości widoczne były wartości false
(standardowo echo powoduje konwersje wyniku
do typu string – napisu, co owocuje konwersja
wartości false typu boolean – zwracanego przez
operatory porównania – do pustego napisu).
W przykładzie wartość true po konwersji do cyfry
całkowitej uzyskuje wartość 1, false zaś 0.
Po wykonaniu przykładu PHP wygeneruje napis
010101 (patrz komentarze przy poszczególnych
instrukcjach echo). Porównanie 1 z \’1\’
zwraca false, bo pomimo ze wartości obu zmiennych
sa identyczne (1 i 1), to są one innego typu
(liczba całkowita – integer oraz napis – string).
Sprawdźmy jak będzie wyglądał wynik działania
powyższego skryptu, gdy zastąpimy operatory
=== oraz !== operatorami == i !=. Zastanówmy
sie, co się stało, ze uzyskaliśmy taki
a nie inny wynik działania programu.
Istnieje jeszcze jeden często wykorzystywany
operator, należący do operatorów logicznych (pozostałym operatorom logicznym przyjrzymy
sie przy innej okazji). Operator ten to ! (wykrzyknik)
– logiczne \”nie\”. Zwraca on false dla wartości
true oraz true dla wartości false.
Konstrukcje warunkowe
Są chyba najczęściej wykorzystywanymi konstrukcjami
podczas budowy oprogramowania. Bardzo
ważne jest bowiem, aby istniała możliwość sterowaniem
wykonania poszczególnych bloków kodu.
Instrukcja if
Najpopularniejsza instrukcja warunkowa jest if.
Instrukcja ta wyodrębnia fragment kodu, który ma
zostać wykonany tylko w przypadku spełnienia
określonego warunku. Jej postać jest następująca:
if ([warunek]) {
// tutaj kod, który ma zostac A wykonany tylko w przypadku A spełnienia warunku [warunek]
}
Jeśli kod do wykonania w przypadku spełnienia
warunku jest jednolinijkowy, można go
umieścić bezpośrednio po instrukcji if, pomijając
nawiasy klamrowe, jest to jednak niezalecane ze
względu na ograniczenie czytelności takiego kodu.
Oto przykład użycia instrukcji if:
A co z liczbami nieparzystymi? Na szczęście
wraz z instrukcja if można użyć instrukcji else,
wykonującej sie wówczas, gdy warunek z if nie
zostanie spełniony:
if ($reszta == 0) {
echo \"liczba $liczba jest A parzysta\";
} else {
echo \"liczba $liczba jest A nieparzysta\";
}
Częsta sytuacja jest konieczność użycia
w miejscu else innego warunku, sprawdzanego
w przypadku niespełnienia warunku poprzedniego.
Służy do tego instrukcja elseif:
Instrukcja switch
Instrukcja switch jest rozwiązaniem na niektóre
rodzaje drabinek warunków elseif. Konstrukcje
typu:
if ($opcja ==1) {
echo \"opcja 1\";
} elseif($opcja == 2) {
echo \"opcja 2\";
} elseif($opcja == 3) {
echo \"opcja 3\";
} //...
czyli porównanie tej samej zmiennej (tutaj $opcja)
kolejno do rożnych wartości (tutaj 1, 2 oraz
3), można zastąpić blokiem switch:
switch($opcja) {
case 1:
echo \"opcja 1\";
break;
case 2:
echo \"opcja 2\";
break;
case 3:
echo \"opcja 3\";
break;
}
Po instrukcjach case trzeba umieszczać wartości,
do których chcemy porównywać zmienna
z instrukcji switch.
Bardzo ważna jest tu instrukcja break. Powoduje
ona przerwanie wykonywania dalszych instrukcji
i skok do kodu umieszczonego po bloku
switch. Jeśli usuniemy pierwsza instrukcje break,
a zmiennej $opcja przypiszemy wartość 1, spowoduje
to wykonanie dwóch pierwszych instrukcji
echo. Dlaczego? Instrukcja switch poszukuje
pierwszego wyrażenia case, z wartością pasująca
do zmiennej – tu $opcja, a następnie rozpoczynając
od pasującego case wykonuje wszystkie
instrukcje aż do napotkania instrukcji break przerywającej
konstrukcje switch. Ignoruje ona przy
tym kolejne napotkane po drodze instrukcje case,
wykonując kod po nich zawarty, niezależnie
od tego czy określony warunek jest spełniony czy
tez nie. Oto przykład:
Pozostawione tu zostały instrukcje case odnoszące
sie do autorów, forum oraz premiery.
Ponieważ jednak te strony nie zostały zaimplementowane,
wyświetlana jest jedynie wspólna
dla nich informacja o tym, ze dany dział jest
w budowie. Jednym słowem, jeśli zmienna
$strona zawiera wartość autorzy, wartość ta
poszukiwana jest wśród wszystkich instrukcji
case. Jeśli zostanie znaleziona, wykonywany
zostanie cały kod, aż do napotkania pierwszej
instrukcji break, czyli w tym przypadku po wyświetleniu
informacji o tym, ze dany dział jest
w budowie.
Trzeba pamiętać o takim działaniu instrukcji
switch, gdyż przypadkowe pominiecie instrukcji
break może doprowadzić (i zapewne tak sie stanie)
do błędnego działania programu.
Co jednak, jeśli dział nie istnieje, czyli gdzie
nasze else? Zobaczmy:
switch ($strona) {
case \'index\':
echo \'strona główna\';
break;
case \'nowosci\':
echo \'strona z nowościami\';
break;
case \'autorzy\':
case \'forum\':
case \'premiera\':
echo \'W budowie\';
break;
default:
echo \'Strona nie istnieje!\';
}
Jeśli chcemy w instrukcji switch wyłapać wszystkie
wartości nie pasujące do żadnego ze wzorców
case, musimy skorzystać z instrukcji default.
Co daje konstrukcja switch? Głównie większa
czytelność niż siec instrukcji warunkowych if.
Ternariusz
Jest instrukcja służąca do wykonania prostej operacji
w zależności od wyniku zadanego warunku:
[warunek] ? [wyrażenie1] : A
[wyrażenie2];
Jeśli warunek jest spełniony, wykonane zostanie
wyrazenie1, w przeciwnym razie wyrazenie2.
Oto prosty przykład:
Warunek zapisany w ten sposób oznacza to
samo co $flaga == true. Operator ten jest rzadko
wykorzystywany, jednak są sytuacje, w których
jest bardzo wygodny.
Petle
Pętle są nieodzownym elementem niemal każdego
programu. Pozwalają na wielokrotne wykonanie
tych samych fragmentów kodu. Wykorzystuje
sie je w rożnych sytuacjach – podczas
obliczeń, wyświetlania danych pochodzących
z tablic/plików/baz danych (jak korzystać z plików
i baz danych dowiemy sie w następnych
odcinkach kursu, najpierw musimy dobrze poznać
podstawy PHP).
Petla for
Jest najczęściej spotykanym typem pętli. Ma ona
ogólna postać:
for ([inicjalizacja zmiennej]; A
[warunek zakonczenia petli]; A
[obliczenia]) {
//instrukcje do wielokrotnego A wykonania
}
Wyrażenie inicjalizacja zmiennej wykonywane
jest tylko raz, przed pierwszym przebiegiem pętli.
Wyrażenie warunek zakończenia obliczane jest na
początku każdego kolejnego przebiegu pętli – pętla
jest wykonywana tak długo, aż jest on spełniony.
Wyrażenie obliczenia wykonywane jest po każdej
iteracji (czyli przed wyrażeniem warunek zakończenia
pętli).
Pominiecie warunku zakończenia pętli oznacza,
ze pętla jest nieskończona:
for ([inicjalizacja zmiennej]; ; A
[obliczenia]) {
}
Często tworząc pętle nieskończoną pomija sie
wszystkie trzy bloki:
for (;;) {
}
Pamiętajmy jednak, ze średniki są zawsze konieczne.
Oto prosta pętla wyświetlająca kolejne
liczby od 0 do 9:
for ($i=0; $i<=9; $i++) {
echo \"$i
\";
}
Zanim pętla zostanie wykonana, zmiennej
$i przypisana zostanie wartość 1 (krok 1), następnie
sprawdzany zostaje warunek $i{html}<={/html}9 (krok 2).
Jesli jest on spełniony, wykonane zostaną instrukcje
umieszczone pomiędzy { a } (tak jak w przypadku
warunku if, tak i tu pojedyncza instrukcja
może być umieszczona z pominięciem nawiasów
klamrowych, jednak nie zaleca sie takiego postępowania)
– krok 3.
Następnie zmienna $i zwiększana
jest o 1 – $i++ (krok 4). Kroki 2-4 powtarzają
sie do momentu az warunek zakończenia
nie zostanie spełniony (czyli gdy $i będzie większe
od 9).
Pętla while
Petla while jest prostsza od for:
while ([warunek zakończenia petli])A
{
//instrukcje do wielokrotnego A wykonania
}
Wykonuje sie ona dopóty, dopóki warunek zakończenia
petli jest prawdziwy. Najczęściej wykorzystywana
jest razem z różnego rodzaju funkcjami
(o funkcjach w jednej z następnych części kursu).
Pętla z poprzedniego przykładu (for), zapisana
za pomocą instrukcji while, może wyglądać na
przykład tak:
\';
}
?>
Pamiętajmy, ze operator ++ umieszczony po
zmiennej zwiększa wartość tej zmiennej po
zwróceniu jej aktualnej wartości. Tak wiec instrukcja
echo wyświetli tu wartość zmiennej $i,
jaka zmienna ta miała przed wykonaniem inkrementacji.
Inaczej mówiąc, najpierw zostanie
wyświetlona wartość zmiennej $i, a dopiero następnie
wartość ta zostanie zwiększona o 1. Instrukcje
echo z powyższego przykładu można
rozbić na dwa polecenia:
echo $i;
$i++; //badz $i=$i+1, badz $i+=1, A
badz ++i
Pętla do..while
Działanie tej pętli jest zbliżone do działania pętli
while, z ta różnica, ze instrukcje, których wykonanie
w przypadku pętli while było uzależnione
od spełnienia warunku, w przypadku do..while
zawsze wykonają sie przynajmniej raz. Dlaczego?
Pętla while sprawdza warunek już przed
pierwszym swoim przebiegiem i jeśli nie zostanie
on spełniony, wówczas instrukcje zawarte
pomiędzy nawiasami klamrowymi petli nie zostaną
nigdy wykonane.
Pętla do..while natomiast
sprawdza warunek po każdym przebiegu. Oznacza
to, ze podczas pierwszego przebiegu najpierw
wykona ona odpowiednie instrukcje,
a dopiero później sprawdzi warunek zakończenia.
Od wyniku tego warunku uzależnione będzie
ponowne wykonanie pętli, jednak zawsze
wykona sie ona minimum jeden raz. Oto postać
pętli do..while:
do {
//instrukcje do wielokrotnego A wykonania
} while ([warunek]);
A oto przykład wykorzystania pętli:
W wyniku działania tego programu wyświetlona
zostanie wartość 0. Zapisanie tego samego
warunku za pomocą pętli while spowoduje, ze
program nic nie wyświetli – instrukcja echo nigdy
sie nie wykona:
Pętla do..while jest najrzadziej używanym rodzajem
pętli.
Pętla foreach
Pętla foreach jest inna odmiana pętli. Wszystkie
poznane rodzaje pętli wykonywały sie do momentu,
w którym przestał być spełniany określony
przez warunek. Pętla foreach działa inaczej
– pozwala na iteracje po tablicach PHP. Ma następująca
postać:
foreach ($tablica as $wartosc) {
//instrukcje do wielokrotnego A wykonania
}
Pętla ta przechodzi po kolejnych elementach
tablicy $tablica i przypisuje jej kolejne wartości
do zmiennej $wartość:
\";
}
?>
W wyniku wykonania powyższego programu
uzyskamy napis:
Imię Jan
Imię Iwona
Imię Sławomir
Jak widać, pętla wybierała po kolei wszystkie
wartości przechowywane w tablicy i przypisywała
je do zmiennej $zmienna. Dzięki temu wartości
te można wyświetlić za pomocą prostej instrukcji
echo.
Pętla foreach działa na kopii tablicy, wiec modyfikacja
wartości zmiennej (tutaj $zmienna) nie
ma wpływu na zawartość tablicy źródłowej (tutaj
$tablica).
Pętla foreach pozwala takze na pobieranie kolejnych
par klucz=>wartość tablic (w tym tablic
asocjacyjnych):
foreach ($tablica as $klucz=>$ A
wartosc) {
//instrukcje do wielokrotnego A wykonania
}
Oto przykład:
\'Jan\',\'nazwisko\' => \'Kowalski\');
foreach ($tablica as $klucz =>$wartosc) {
echo \"$klucz: $wartosc
\";
}
?>
W wyniku działania powyższego programu otrzymamy
napis:
imię: Jan
nazwisko: Kowalski
Pętla foreach jest bardzo przydatna podczas
pracy z językiem PHP. Będziemy z niej korzystali
jeszcze wiele razy.
Cechy wspólne pętli
Czasami występuje konieczność przerwania pętli
w określonej sytuacji. Służy do tego instrukcja
break. Pozwala ona na natychmiastowe przerwanie
wykonania pętli i skok do kodu znajdującego
sie za nią:
5) {
break;
}
echo \"$i
\";
}
?>
Powyższy kod spowoduje wyświetlenie cyfr
z zakresu 0-5, mimo iż warunek zakończenia dopuszcza
liczby z zakresu 0-9. Gdy wartość zmiennej
$i będzie większa od 5, wykonana zostanie
instrukcja break przerywająca wykonanie pętli.
Gdy chcemy przerwać dalsze wykonywanie
pewnego przebiegu pętli, nie przerywając jednocześnie
całkowicie jej działania, wówczas z pomocą
przychodzi instrukcja continue. W przykładzie
wyświetlimy cyfry z zakresu 0-9 z pominięciem
liczby 5:
\";
}
?>
Z instrukcji break i continue możemy korzystać
we wszystkich dostępnych w PHP rodzajach pętli.
Rzadko używana możliwością tych instrukcji
jest podanie głębokości wyjścia lub cofnięcia
sie – przydaje sie to w przypadku pętli zagnieżdżonych:
\';
for ($j=0; $j<=4; $j++) {
if ($j == 3) {
continue 2; //wyjscie o A dwa poziomy czyli do A pierwszej petli
}
echo \"$i x $j = \".($i*$j). A
\'
\';
}
}
?>
Na zakończenie zwróćmy uwagę na formatowanie
kodu podanych w tym artykule przykładów.
Dla lepszej czytelności kodu warto utworzyć
nawias klamrowy (czyli rozpoczniemy nowy
blok kodu) przechodząc do nowej linii i zrobić
wcięcie, np. na trzy spacje lub tabulator.