Menu

Operator trójargumentowy w PHP: skrót ?: i zagnieżdżanie

Operator trójargumentowy w PHP to if/else w jednej linii: $result = $condition ? 'yes' : 'no';. Poznaj skrócony zapis ?: (operator Elvis), różnicę względem ??, powód, dla którego zagnieżdżone wyrażenia od PHP 8 wymagają nawiasów, i sytuacje, w których match jest czytelniejszy.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Operator trójargumentowy to if/else, który mieści się w jednym wyrażeniu: condition ? valueIfTrue : valueIfFalse. Zwraca jedną z dwóch wartości, więc możesz ją przypisać, wypisać przez echo albo przekazać do funkcji.

Zmień $age na 15, a $items na 3 i uruchom ponownie. Zwróć uwagę na nawiasy wokół operatora w ostatniej linii: bez nich . najpierw połączyłoby łańcuchy i wynik nie byłby tym, czego chcesz.

Operator trójargumentowy w szablonach HTML

Operator trójargumentowy to typowy sposób wyboru klasy CSS, etykiety albo atrybutu w szablonie. Ten blok czyta ?stock= z URL: uruchom go, potem kliknij linki na karcie Page, a ten sam skrypt wykona się ponownie z inną wartością.

<?= ... ?> to skrót od <?php echo ... ?>, dzięki czemu jednowierszowe warunki w znacznikach pozostają czytelne.

Skrócony zapis ?: (operator Elvis)

Pomiń środkową część, a dostaniesz $a ?: $b: zwraca $a, gdy $a jest prawdziwe, w przeciwnym razie $b. Przydaje się do wartości domyślnych, gdy pusty łańcuch albo 0 też mają prowadzić do wartości zastępczej.

Wartości fałszywe to false, 0, 0.0, "", "0", [] i null. Jeśli "0" jest w Twoich danych prawdziwą odpowiedzią (pole ilości, PIN), skrócony operator ją odrzuci.

?: vs ??

Wyglądają podobnie, ale sprawdzają co innego. ?: sięga po wartość zastępczą, gdy lewa strona jest fałszywa. ?? sięga po nią tylko wtedy, gdy lewa strona to null albo nie jest ustawiona, i nie ostrzega o brakującej zmiennej ani kluczu tablicy.

Używaj ?? dla „wartość może nie istnieć” (dane żądania, tablice konfiguracji, opcjonalne klucze). Używaj ?: dla „wartość istnieje, ale może być pusta”. Strona o operatorze null coalescing szczegółowo opisuje ?? i ??=.

Zagnieżdżony operator wymaga nawiasów

PHP 7 czytał a ? b : c ? d : e od lewej do prawej, inaczej niż prawie każdy inny język, i dawał złe wyniki. PHP 8 odmawia zgadywania:

<?php
echo $score > 90 ? "A" : $score > 80 ? "B" : "C";
PHP Fatal error:  Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /home/index.php on line 2

Dodaj nawiasy wokół wewnętrznego operatora, a zadziała:

Wyjątkiem jest skrócony zapis: $a ?: $b ?: $c jest dozwolony bez nawiasów, jak w przykładzie z operatorem Elvis powyżej.

match(true), gdy gałęzi jest więcej niż dwie

Zagnieżdżony operator trójargumentowy z trzema lub czterema poziomami trudno czytać nawet z nawiasami. match z true jako podmiotem sprawdza warunki od góry do dołu i zwraca pierwszą pasującą gałąź:

Zostaw operator trójargumentowy dla dwóch wyników w jednej linii, a po match albo łańcuch if/elseif sięgnij, gdy tylko potrzebujesz trzeciego.

Najczęściej zadawane pytania

Co to jest operator trójargumentowy w PHP?

Krótka forma if/else, która zwraca wartość: $label = $age >= 18 ? 'adult' : 'minor';. Jeśli warunek przed ? jest prawdziwy, używane jest wyrażenie po ?, w przeciwnym razie to po :.

Co oznacza ?: w PHP?

$a ?: $b to skrócony operator trójargumentowy (zwany też operatorem Elvis). Zwraca $a, jeśli $a jest prawdziwe, a w przeciwnym razie $b, więc '' ?: 'default' daje 'default'. To to samo co $a ? $a : $b, ale $a jest obliczane tylko raz.

Czy można zagnieżdżać operatory trójargumentowe w PHP?

Tylko z nawiasami. Od PHP 8 $a ? 'x' : $b ? 'y' : 'z' to błąd krytyczny, więc pisz $a ? 'x' : ($b ? 'y' : 'z'). Przy więcej niż dwóch gałęziach łatwiej czyta się match(true) albo łańcuch if/elseif.

Czy mogę użyć operatora trójargumentowego bez części else?

Nie, operator trójargumentowy zawsze wymaga obu gałęzi. Dla „użyj tej wartości albo zastępczej” napisz $x ?: 'default' lub $x ?? 'default'; aby coś zrobić tylko wtedy, gdy warunek jest spełniony, napisz zwykłe if albo $condition && doSomething();.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ