Kursy mojej produkcji

2.1 Instrukcje warunkowe if, elseif i else

Instrukcje warunkowe są jednym z najczęściej wykorzystywanych elementów w językach programistycznych. Tak naprawdę wszystkie procesy zachodzące w aplikacjach, w tym skryptach PHP rozbijają się o logikę. Jeżeli wystąpiły takie parametry wtedy wykonaj takie operacje, jeżeli inne wtedy wykonaj inne operacje.

Konstrukcja if

Tłumacząc na polski instrukcja if to nic innego jak polskie jeżeli. Składnia konstrukcji jest prosta. W nawiasie zwykłym znajduję się warunek i jeżeli zostanie spełniony wtedy wykona się kod umiejscowiony w bloku.
Kod:
<?php
$a 1;

if($a == 1)
{
 echo 'Zmienna $a ma wartość 1';
}
?>
Jak widzimy na powyższym listingu został użyty operator porównania. Oprócz operatorów porównania możemy także używać operatorów logicznych i innych w zależności od potrzeb sytuacji.
Kod:
<?php
$b false;

if(!$b)
{
 echo 'Zanegowana zmienna $b ma wartość true';
}
?>

Konstrukcja elseif

Konstrukcję elseif tłumaczymy w przeciwnym wypadku jeżeli. Ów klauzulę możemy użyć po if albo innym elseif. Zapis elseif i else if oznacza to samo. To jaka formę będziecie stosować zależy tylko od Was.
Kod:
<?php
$a true;

if(!$a// Ten warunek nie zostanie spełniony
{
 echo 'Zanegowana wartość zmiennej $a wynosi true';
}
elseif($a && is_bool($a))
{
 echo 'Zmienna $a jest typem boolowskim i ma wartość true';
}
?>
Oczywiście możemy dodać więcej niż jedną konstrukcję elseif.
Kod:
<?php
$a 3;

if($a 4// Warunek niespełniony
{
 echo '$a jest większe niż 4<br />';
}
else if($a 3// Warunek niespełniony
{
 echo '$a jest większe niż 3<br />';
}
else if($a 2// Warunek spełniony
{
 echo '$a jest większe niż 2<br />';
}
else if($a 1// Ten warunek nie zostanie spełniony ponieważ warunek powyżej został spełniony
{
 echo '$a jest większe niż 1';
}
?>
Pamiętajmy, że w momencie spełnienia warunku przez instrukcje warunkowe kolejne warunki nie będą już sprawdzane.

Konstrukcja else

Klauzule else oznacza w innym wypadku. Możemy ją wstawić na końcu instrukcji sprawdzających tj. po if albo elseif. Instrukcja else zostanie wykonana w sytuacji kiedy wszystkie poprzednie warunki nie zostaną spełnione.
Kod:
<?php
$a 2;

if($a == 1)
{
 echo '$a jest równe 1';
}
else
{
 echo '$a nie jest równe 1';
}
?>

Grupowanie warunków

Zdarzają się sytuacje, w których występuję więcej niż jeden warunek. Przy większej ilości warunków grupowanie warunków może stać się czynnością bardzo pomocna.
Kod:
<?php
$a $c true;
$b $d false;

if($a AND $b || $c OR $d)
{
 echo 'Udało się';
}
?>
Grupowanie dla powyższego przykładu powinno wygadać tak:
Kod:
<?php
$a $c true;
$b $d false;

if(($a && $b) || ($c || $d))
{
 echo 'Udało się';
}
?>

Opuszczanie nawiasów klamrowych

Jeżeli blok kodu zawiera tylko jedną instrukcje wtedy PHP dopuszcza możliwość opuszczenia nawiasów klamrowych. Taki manewr zmniejsza ilość linijek kosztem czytelności dokumentu.
Kod:
<?php
$a = -1;

if($a// Warunek zostanie spełniony
 echo 'Warunek instrukcji warunkowej został spełniony'; 
else
 echo 'Warunek instrukcji warunkowej nie został spełniony';
?>
W przypadku dodania ekstra linijki po warunku zostaniemy poinformowani o błędzie parsera.

Rzutowanie niejawne

Podczas porównywania warunków z użyciem operatora == czyli równa się, PHP sprowadza obie wartości do jednego typu, a dopiero potem porównuje je. Oczywiście taka sytuacja ma miejsce kiedy porównywane typy zmiennych są rożne od siebie.
Kod:
<?php
if(true == 1)
{
 echo 'Prawda';
}
?>
Teraz dodajcie jeszcze jeden znak równa się do warunku i uruchomcie ponownie skrypt. Oczywiście tym razem warunek nie zostanie spełniony. Operator sprawdzania równości jak i identyczności przydaje się przy niektórych funkcjach zwracających różne typy wartości w zależności od powodzenia bądź niepowodzenia operacji.

Błąd początkujących

Czasami zdarza się, że osoby początkujące mylą = z == co w rezultacie powoduje wiele niepotrzebnego zamieszania. Jeżeli Twoja instrukcja warunkowa zachowuje się tak, jakby jej warunek był zawsze prawdziwy, upewnij się, że wstawiłeś tam prawidłowy operator!
Kod:
<?php
if($x = 7)
{
 echo 'Zmienna $x ma wartość 7';
}
?>

Szybkie omijanie warunku

Czasami zdarza się, że musimy na szybko zmienić warunek instrukcji celem sprawdzenia poprawności działania kodu. W takim przypadku najłatwiej jest po prostu użyć wlepki zaprezentowanej poniżej.
Kod:
<?php
$a true;
$b $c false;

if($a AND $b || $b OR $c || 1==1// Proste obejście
{
 echo 'ok';
 // i inne działania...
}
?>
Według mnie najwygodniej jest je dodawać w widocznym miejscu czyli albo na początku albo na końcu warunków. Osobiście preferuje koniec natomiast Wy wybierzcie miejsce, które odpowiada Wam najbardziej.

Ciekawostka

Używanie operatora porównania === do sprawdzania identyczności jest o około 5% szybsze aniżeli używanie operatora == do sprawdzania równości. Oczywiście przy kilkunastu instrukcjach warunkowych nie robi to wielkiego znaczenia jednak jeżeli mamy bardzo rozbudowaną aplikacje i instrukcje warunkowe idą w tysiące wtedy ta mała różnica może przyczynić się do nieco szybszego działania skryptu. Szybsze działanie przy użyciu operatora identyczności ma związek z faktem, że nie zachodzi potrzeba konwersji (rzutowania) na inny typ.

Tabele porównań typów PHP

Poniżej zostały zamieszczone tabele dla rożnych typów porównań.

Porównanie zmiennej $x z funkcjami PHP

Wyrażenie gettype() empty() is_null() isset() boolean: if($x)
$x = ""; string true false true false
$x = null; null true true false false
var $x; null true true false false
niezdefiniowany $x null true true false false
$x = array(); array true false true false
$x = false; boolean true false true false
$x = true; boolean false false true true
$x = -1; integer false false true true
$x = 0; integer true false true false
$x = 1; integer false false true true
$x = 7; integer false false true true
$x = "-1"; string false false true true
$x = "0"; string true false true false
$x = "1"; string false false true true
$x = "php"; string false false true true
$x = "true"; string false false true true
$x = "false"; string false false true true

Porównania operatorem ==

true false 1 0 -1 "1" "0" "-1" null array() "php" ""
true true false true false true true false true false false true false
false false true false true false false true false true true false true
1 true false true false false true false false false false false false
0 false true false true false false true false true false true true
-1 true false false false true false false true false false false false
"1" true false true false false true false false false false false false
"0" false true false true false false true false false false false false
"-1" true false false false true false false true false false false false
null false true false true false false false false true true false true
array() false true false false false false false false true true false false
"php" true false false true false false false false false false true false
"" false true false true false false false false true false false true

Porównania operatorem ===

true false 1 0 -1 "1" "0" "-1" null array() "php" ""
true true false false false false false false false false false false false
false false true false false false false false false false false false false
1 false false true false false false false false false false false false
0 false false false true false false false false false false false false
-1 false false false false true false false false false false false false
"1" false false false false false true false false false false false false
"0" false false false false false false true false false false false false
"-1" false false false false false false false true false false false false
null false false false false false false false false true false false false
array() false false false false false false false false false true false false
"php" false false false false false false false false false false true false
"" false false false false false false false false false false false true