Instrukcja if...else
Instrukcję już omawialiśmy i stosowaliśmy, teraz przyszedł czas aby usystematyzować i rozwinąć wiedzę w zakresie jej stosowania.
W najprostszej postaci, instrukcja ta występuje bez else
i ma postać:
if (warunek) //jeżeli spełniony jest warunek (posiada wartość true)
instrukcja; //to wykonywana jest instrukcja
Zwróć uwagę na zapis if (warunek)
, który można przeczytać jeżeli spełniony jest warunek
. Ten sposób zapisu oznacza dokładnie to samo, co zapis if (warunek===true)
. Podobnie zapis if (!warunek)
- jeżeli nie jest spełniony warunek
, oznacza to samo co if (warunek===false)
. Dla jasności sytuacji - operujemy teraz na pseudokodzie, aby uprościć przykłady. W prawdziwym kodzie, warunek
musiałby mieć postać wyrażenia logicznego, np. $a>$b
lub być zmienną np. $warunek
typu logicznego. Podobnie słowa instrukcja
zastępują prawdziwe instrukcje - np. $a+=2;
.
Zamiast pojedynczej instrukcji, może występować blok instrukcji, a więc wiele instrukcji objętych nawiasami klamrowymi:
if (warunek) //jeżeli spełniony jest warunek, to
{
instrukcja_1;
instrukcja_2;
...
//wykonywany jest blok instrukcji, składający się z wielu instrukcji
}
Ćwiczenie 1_11_1_1. Testowanie instrukcji warunkowej w postaci
if (warunek) instrukcja;
Przetestuj pokazaną wyżej instrukcję. Zastosuj dwa pliki: cwicz_1_11_1_1/formularz.html z formularzem oraz plik cwicz_1_11_1_1/wyniki.php ze skryptem PHP:
<!doctype html>
<html>
<head>
<title>Testowanie skryptów PHP</title>
<meta charset="UTF-8" />
</head>
<body>
<form action="wyniki.php" method="post">
<input type="text" name="pole_1" />
<input type="text" name="pole_2" />
<input type="submit" name="wyslij" value="Wyślij" />
</form>
</body>
</html>
<!doctype html>
<html>
<head>
<title>Testowanie skryptów PHP</title>
<meta charset="UTF-8" />
</head>
<body>
<?php
$a=$_POST['pole_1'];
$b=$_POST['pole_2'];
$warunek=$a>$b;
if ($warunek) //jeżeli spełniony jest warunek, to
{
echo 'instrukcja_1'.'<br />';
echo 'instrukcja_2'.'<br />';
//wykonywany jest blok instrukcji, składający się z wielu instrukcji
}
echo 'kolejna instrukcja programu po zakończeniu instrukcji if';
?>
</body>
</html>
- Kolejne instrukcje w tym przykładzie to
echo 'instrukcja_n'
. - Warunek znajdujący się zaraz po
if
sprawdza, czy liczba wpisana w pierwszym polu formularza jest większa od liczby wpisanej w polu drugim. - Jeżeli warunek nie jest spełniony, to żadna z instrukcji
bloku if
nie będzie wykonana. - Jeżeli warunek jest spełniony, to wszystkie instrukcji
bloku if
są wykonywane.
W pokazanej wyżej postaci działanie jest proste. Instrukcja (lub blok instrukcji) będzie wykonana tylko wtedy, gdy będzie spełniony warunek
. I tyle. Jeżeli chcemy napisać kod wykonywany w sytuacji, gdy warunek
nie jest spełniony, musimy zastosować else
. Otrzymujemy wtedy postać:
if (warunek) //jeżeli spełniony jest warunek
instrukcja_1; //wykonywana jest instrukcja_1
else //w przeciwnym razie
instrukcja_2; //wykonywana jest instrukcja_2
Ćwiczenie 1_11_1_2. Testowanie instrukcji warunkowej w postaci
if (warunek) instrukcja1; else instrukcja2;
Przetestuj pokazaną wyżej instrukcję. Tak jak poprzednio zastosuj dwa pliki. Tym razem pokazuję tylko skrypt PHP:
<?php
$a=$_POST['pole_1'];
$b=$_POST['pole_2'];
$warunek=$a>$b;
if ($warunek) //jeżeli spełniony jest warunek
echo 'instrukcja_1'; //wykonywana jest ta instrukcja
else //w przeciwnym razie
echo 'instrukcja_2'; //wykonywana jest ta instrukcja
echo '<br />kolejna instrukcja programu po zakończeniu instrukcji if...else';
?>
- Jeżeli warunek jest spełniony, to wykonana jest instrukcja
echo 'instrukcja_1'
. - Jeżeli warunek nie jest spełniony, to wykonana jest instrukcja
echo 'instrukcja_2'
.
Oczywiście zamiast pojedynczych instrukcji, mogą występować bloki instrukcji. Instrukcja if...else
może być bardziej rozbudowana, ponieważ bardzo często sytuacja nie jest "czarno-biała" w myśl jeżeli nie to, to coś innego. Możemy mieć sytuację kiedy jest kilka warunków, które się wzajemnie wykluczają i spełnienie każdego z nich powoduje różne skutki. Zastosujemy wtedy konstrukcję:
if (warunek_1) //jeżeli spełniony jest warunek_1
instrukcja_1; //to wykonywana jest instrukcja_1
else if (warunek_2) //w przeciwnym razie, jeżeli spełniony jest warunek_2
instrukcja_2; //wykonywana jest instrukcja_2
else if (warunek_3) //w przeciwnym razie, jeżeli spełniony jest warunek_3
instrukcja_3; //wykonywana jest instrukcja_3
else if (warunek_4) //w przeciwnym razie, jeżeli spełniony jest warunek_4
instrukcja_4; //wykonywana jest instrukcja_4
...
else
instrukcja_n; //wykonywana jest instrukcja_n
instrukcja_programu; //koniec if...else, kontynuacja programu
...
Zwróć uwagę, że ostatnia instrukcja_n
nie ma żadnego warunku - będzie wykonana wtedy, kiedy nie jest spełniony żaden ze zdefiniowanych warunków.
- jeżeli
warunek_1
posiada wartośćtrue
, to jest wykonywanainstrucja_1
, a następnieinstrukcja_programu
, która jest kontynuacją programu, po zakończeniu bloku instrukcji warunkowych; - jeżeli
warunek_1
posiada wartośćfalse
, to zostaje sprawdzonywarunek_2
, jeżeliwarunek_2
ma wartośćtrue
, to jest wykonywanainstrukcja_2
, a następnieinstrukcja_programu;
- jeżeli jest sprawdzany
warunek_2
i ma on wartośćfalse
, to zostaje sprawdzonywarunek_3
, jeżeliwarunek_3
ma wartośćtrue
, to jest wykonywanainstrukcja_3
, a następnieinstrukcja_programu;
- jeżeli jest sprawdzany
warunek_3
i ma on wartośćfalse
, to zostaje sprawdzonywarunek_4
, jeżeliwarunek_4
ma wartośćtrue
, to jest wykonywanainstrukcja_4
, a następnieinstrukcja_programu;
- jeżeli żaden z warunków nie został spełniony (wszystkie posiadały wartość
false
, wykonywana jestinstrukcja_n
, a następnieinstrukcja_programu
Należy zwrócić uwagę, że w PHP można pisać else if
(ze spacją), ale również poprawny będzie zapis elseif
.
Zastanówmy się jak będzie działał nasz skrypt, jeżeli usuniemy z kodu wszystkie else
. Jeżeli wszystkie warunki wykluczają się wzajemnie, to i tak będzie wykonana tylko jedna instrukcja następująca po spełnionym warunku. Po co więc else
? Chociażby po to, aby interpreter nie sprawdzał wszystkich warunków znajdujących się po warunku spełnionym. Jeżeli mielibyśmy kilka warunków prawdziwych, to brak else
spowoduje wykonanie wszystkich instrukcji znajdujących się przy tych warunkach. Zastosowanie else
powoduje wykonanie tylko jednej instrukcji znajdującej się przy prawdziwym warunku poprzedzającycm else
.
Ćwiczenie 1_11_1_3. Testowanie instrukcji else if
Przetestuj pokazaną wyżej instrukcję. Tak jak poprzednio zastosuj dwa pliki. W formularzu umieść 5 pól tekstowych. Zastosuj następujący kod PHP:
<?php
$a=$_POST['pole_1'];
$b=$_POST['pole_2'];
$c=$_POST['pole_3'];
$d=$_POST['pole_4'];
$e=$_POST['pole_5'];
$warunek_1=$a<$b;
$warunek_2=$b<$c;
$warunek_3=$c<$d;
$warunek_4=$d<$e;
if ($warunek_1) //jeżeli spełniony jest warunek_1
echo 'instrukcja_1'; //to wykonywana jest ta instrukcja
else if ($warunek_2) //w przeciwnym razie, jeżeli spełniony jest warunek_2
echo 'instrukcja_2'; //wykonywana jest ta instrukcja
else if ($warunek_3) //w przeciwnym razie, jeżeli spełniony jest warunek_3
echo 'instrukcja_3'; //wykonywana jest ta instrukcja
else if ($warunek_4) //w przeciwnym razie, jeżeli spełniony jest warunek_4
echo 'instrukcja_4'; //wykonywana jest ta instrukcja
echo '<br />instrukcja_programu'; //koniec if...else, kontynuacja programu
?>
- Zwróć uwagę, że wszystkie warunki będą spełnione, gdy każda liczba będzie większa od poprzedniej (wpisane w kolejności rosnącej). Sprawdź jak zadziała skrypt w takiej sytuacji - powinna być wykonana tylko pierwsza instrukcja.
- Sprawdź działanie skryptu dla różnych liczb. Zwróć uwagę, że zawsze będzie wykonana tylko jedna instrukcja, znajdująca się przy prawdziwym warunku. Jeżeli żaden warunek nie będzie spełniony, to żadna z instrukcji nie będzie wykonana.
- Usuń z kodu wszystkie
else
i ponownie wpisz liczby w kolejności rosnącej. Tym razem powinny być wykonane wszystkie instrukcje.
Instrukcje if...else
, możemy stosować w różnych układach, na przykład:
1) if (warunek_1)
2) {
3) if (warunek_2) instrukcja_2;
4) else if (warunek_3) instrukcja_3;
5) else
6) {
7) instrukcja_4;
8) instrukcja_5;
9) if (warunek_4)
10) {
11) instrukcja_6;
12) if (warunek_5) instrukcja_7;
13) else if (warunek_6) instrukcja_8;
14) else if (warunek_7) instrukcja_9;
15) instrukcja_10;
16) instrukcja_11;
17) }
18) }
19)}
20)else instrukcja_12;
21)instrukcja_programu;
Przeanalizujmy przebieg programu:
- jeżeli
(warunek_1===false)
, to dalszy przebieg programu przechodzi do wiersza20
; -
jeżeli
(warunek_1===true)
, to wykonywany jest blok instrukcji w nawiasach2..19
, a następnie dalszy ciąg programu, począwszy od wiersza21
;- jeżeli
(warunek_2===true)
, to wykonywana jestinstrukcja_2
, a następnie wykonanie przechodzi do wiersza21
; - jeżeli natomiast
(warunek_2===false)
, to sprawdzany jestwarunek_3
; - jeżeli
(warunek_3===true)
, to wykonywana jestinstrukcja_3
, a nstępnieinstrukcja_programu
; - jeżeli
(warunek_3===false)
, to wykonywany jest blok instrukcji w nawiasach6..18
;- wykonywane są instrukcje
instrukcja_4
orazinstrukcja_5
; - jeżeli
(warunek_4===true)
, to wykonywany jest blok instrukcji w nawiasach10..17
, a następnieinstrukcja_programu
; - jeżeli
(warunek_4===false)
, to wykonywana jestinstrukcja_programu
;- wykonywana jest instrukcja
instrukcja_6
; - jeżeli
(warunek_5===true)
, to wykonywana jestinstrukcja_7
, a następnieinstrukcja_10
; - jeżeli
(warunek_5===false)
, to sprawdzany jestwarunek_6
; - jeżeli
(warunek_6===true)
, to wykonywana jestinstrukcja_8
, a następnieinstrukcja_10
; - jeżeli
(warunek_6===false)
, to sprawdzany jestwarunek_7
; - jeżeli
(warunek_7===true)
, to wykonywana jestinstrukcja_9
, a następnieinstrukcja_10
; - jeżeli
(warunek_7===false)
, to wykonywana jestinstrukcja_10
; - wykonywana jest instrukcja
instrukcja_11
;
- wykonywana jest instrukcja
- wykonywane są instrukcje
- jeżeli
- wykonywana jest
instrukcja_programu
.
W tym przykładzie doskonale widać, jak ważne jest stosowanie odpowiednich wcięć, tak aby odpowiednie pary nawiasów otwierający-zamykający, znajdowały się w jednej linii pionowej.
Jeżeli zapomniałeś jak przygotować i gdzie zapisywać pliki testowe: