Struktury kontrolne > Lekcja 2
else i elseif
Ostatnia modyfikacja: 01.06.2021
Wróćmy ponownie do przykładu z poprzedniej lekcji. Mówiliśmy o sytuacji, gdy musimy sprawdzić, czy klient ma określoną ilość pieniędzy w wirtualnym portfelu i tylko jeśli tak, wykonać określone operacje. Teraz dodatkowo chcielibyśmy wyświetlić mu komunikat informacyjny, jeśli ma za mało środków.
Jeśli zrozumiałeś poprzednie tematy, powinieneś już poradzić sobie z wykonaniem takiego kodu:
<?php
$wallet = 15.50;
$purchaseCost = 4.99;
if ($wallet >= $purchaseCost) {
echo 'You can purchase!';
}
if ($wallet < $purchaseCost) {
echo 'You can\'t purchase!';
}
// result: You can purchase!
Jednak taki zapis nie wydaje się wygodny. Musimy zapisać ten sam warunek, tylko zrobić jego przeciwieństwo. Jak zapewne się domyślasz można to uprościć i służy do tego else
. Działa na takiej zasadzie:
<?php
if (wyrażenie) {
// kod do wykonania jeżeli wyrażenie jest prawdziwe
} else {
// kod do wykonania jeżeli wyrażenie nie jest prawdziwe
}
Poprawmy od razu powyższy przykład składający się z dwóch ifów na użycie if
i else
.
<?php
$wallet = 15.50;
$purchaseCost = 4.99;
if ($wallet >= $purchaseCost) {
echo 'You can purchase!';
} else {
echo 'You can\'t purchase!';
}
// result: You can purchase!
Prościej? Myślę, że tak.
Ciekawostka
Jak pewnie zauważyłeś, użyłem zapisu \'
. W sytuacji, gdybym zapisał po prostu apostrof, przerwałbym otwarty wcześniej string i spowodowałbym błąd. Poprzedzając go backslashem, zostanie potraktowany jako część tekstu, a nie jego zakończenie. Podobny trik można zastosować też z cudzysłowem, gdyby string był w nich zapisany: \"
. Oczywiście powyższą instrukcję można byłoby zapisać także w ten sposób:
echo "You can't purchase!";
elseif
Istnieje jeszcze opcja połączenia else
i if
. Dzięki temu możemy od razu dodać kolejny warunek i wykonać go tylko wtedy, gdy wcześniejszy się nie spełni.
<?php
if (wyrażenie1) {
// kod do wykonania jeżeli wyrażenie jest prawdziwe
} elseif (wyrażenie2) {
// kod do wykonania jeżeli wyrażenie1 nie jest prawdziwe, a wyrażenie 2 jest prawdziwe
} else {
// kod do wykonania jeśli żadne wyrażenie nie jest prawdziwe
}
Bazując na poprzednim przykładzie, wyświetlimy klientowi inny komunikat, gdy nie ma żadnych środków w portfelu, a inny, gdy saldo jest powyżej zera.
<?php
$wallet = 15.50;
$purchaseCost = 4.99;
if ($wallet >= $purchaseCost) {
echo 'You can purchase!';
} elseif ($wallet === 0) {
echo 'You can\'t purchase - no money!';
} else {
echo 'You can\'t purchase - not enough money!';
}
// result: You can purchase!
elseif a if
Zauważ, że gdybyśmy zamienili elseif
na zwykły if
, działanie kodu byłoby inne (chociaż akurat w tym przypadku efekt byłby taki sam). Warunek z drugim wyrażeniem byłby sprawdzany za każdym razem, nawet jeśli pierwsze wyrażenie byłoby prawdziwe.
Zgodność z PSR-12
elseif
możemy też zapisać jako else if
(ze spacją). Efekt działania będzie taki sam. Standard PSR-12 nakazuje jednak używania tego pierwszego zapisu, dlatego też taki będę stosował. Dodatkowo zwróć uwagę na ułożenie klamer w moich przykładach - zapisane są właśnie tak, jak zalecają standardy PSR.
Skrócony zapis warunku
W zasadzie nazywane jest to operatorem, jednak pomyślałem, że zrozumienie tego razem z warunkami będzie prostsze i lepsze, dlatego mówię o nim dopiero teraz.
Możemy skrócić zapis przy użyciu konstrukcji z ?
i :
.
<?php
wyrażenie ? co jeśli prawda : co jeśli fałsz
Nie służy on jednak do wykonywania całych instrukcji, a tylko prostych operacji - na przykład przypisań czy wyświetleń.
<?php
$hour = 18;
if ($hour >= 22) {
echo 'night';
} else {
echo 'day';
}
// result: day
<?php
$hour = 18;
echo $hour >= 22 ? 'night' : 'day';
// result: day
Efekt działania obydwu przykładów jest taki sam.
Null coalescing operator php >=7
Mamy też operator ??
, który umożliwia szybkie sprawdzenie, czy dana wartość istnieje i nie jest pusta (null). W takim przypadku zwracana jest wartość po lewej od operatora, a w przeciwnym ta po prawej. Zobaczmy:
<?php
echo $number ?? 'wrong number'; // result: wrong number
$number = null;
echo $number ?? 'wrong number'; // result: wrong number
$number = 5;
echo $number ?? 'wrong number'; // result: 5
W pierwszym przypadku zmienna nie istnieje, a w drugim jest nullem, stąd zwracana jest wartość po prawej od operatora. Gdy tak nie jest, jak w trzecim przypadku, zwrócona będzie wartość po lewej. Podobny rezultat można uzyskać przy użyciu isset()
z pełnym zapisem warunku lub przy użyciu zapisu skróconego. Kwestia dopasowania czego potrzebujemy w danym przypadku.
<?php
$number = 5;
if (isset($number)) {
echo $number;
} else {
echo 'wrong number';
}
// result: 5
<?php
$number = 5;
echo isset($number) ? $number : 'wrong number'; // result: 5
Wraz z php >=7.4 dostaliśmy jeszcze możliwość użycia tego operatora od razu z przypisaniem, gdy dana wartość nie istnieje. Robimy to poprzez dołożenie znaku równości - ??=
.
<?php
$number ??= 20;
echo $number; // result: 20
<?php
$number = 10;
$number ??= 20;
echo $number; // result: 10
Ćwiczenia
- Rozbuduj ćwiczenie 1. z poprzedniej lekcji. Jeśli osoba o wieku
$age
jest pełnoletnia, wyświetl komunikat Adult!, a jeśli nie wyświetl Teenager!. Użyjelse
.
Przykładowe rozwiązanie<?php $age = 22; // your code
- Podziel liczbę osób
$people
na 4-osobowe zespoły.- Jeżeli liczba osób będzie odpowiednia, wyświetl komunikat: Teams: [liczba zespołów].
- Jeśli tylko jedna osoba pozostanie bez zespołu, wyświetl sam komunikat Too few people!.
- W sytuacji, gdy zabraknie miejsca dla większej liczby ludzi, wypisz: Missing: [liczba brakujących osób do pełnego zespołu].
Skorzystaj z
elseif
. Podpowiedź: przypomnij sobie operator modulo.
Przykładowe rozwiązanie<?php $people = 34; // your code
Komentarze