PHPDevs

Projekt obiektowy z Composerem i Twigiem? Czytaj!

Struktury kontrolne > Lekcja 2

else i elseif

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 zamienić warunek na jego dokładne 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. Stąd poprzedzając go backslashem zostanie potraktowany jako część tekstu, a nie jego zakończenie. Podobny trik można zastosować też z cudzysłowem - \".

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 - too little money!';
}
// result: You can purchase!

Uwaga

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.

Uwaga

elseif możemy też zapisać jako else if (ze spacją). Efekt działania będzie taki sam. Standard PSR-12 nakazuje używania zapisu elseif, dlatego też taki będziemy 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 bardziej proste i logiczne, 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

  1. 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żyj else.
    <?php
    $age = 22;
    // your code
    

    Przykładowe rozwiązanie

  2. 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.

    <?php
    $people = 34;
    // your code
    

    Przykładowe rozwiązanie

Poprzednia lekcja Następna lekcja

Udostępnij

  • Facebook
  • Twitter

Komentarze