PHP 8 i 8.1 - sprawdź co nowego!

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

  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