PHP Manual

Operatory trójdzielne w PHP (?:) - warunek w jednej linii

26. 11. 2019

Obsah článku

Operator trójskładnikowy pozwala na skrócenie prostego warunku do jednej linii w miejscu, gdzie parsowanie jest niepotrzebne, skomplikowane lub wręcz niewłaściwe.

TL;DR

Operatory trójskładnikowe są skrótem dla warunków if i else, więc nie musisz ich używać. Są one przydatne do wiecznie powtarzających się fragmentów logiki weryfikacyjnej. Zawsze używaj formatu (warunek ? logika pozytywna : logika negatywna) łącznie z nawiasami. Użyj do krótkiej weryfikacji, aby kod był bardziej przejrzysty i krótszy.

Podstawowe definicje

Często mamy warunek w postaci np:

$a = 5;
$b = 3;
if ($a > $b) {
echo 'To jest większe';
} else {
echo 'Jest mniejszy';
}

Jeśli więc chcemy napisać tylko jedno proste zdanie, musimy użyć 4 linii kodu, które można by zredukować do jednej.

$a = 5;
$b = 3;
echo 'To jest' . ($a > $b ? 'większa' : 'mniejszy');

Generalnie operator trójskładnikowy zapisuje się za pomocą 3 części (dlatego nazywa się "trójskładnikowy"):

(condition ? 'tak' : 'z')

Operatory trójdzielne są bardzo często używane w praktyce, na przykład do oznaczania parzystych wierszy w tabeli:

$pole = [3, 1, 4, 1, 5, 9, 2];
for ($i = 0; $pole[$i]; $i++) {
echo '<tr class=""' . ($i % 2 ? 'z' : 'nawet') . '">';
// To jest w jakiś sposób praca z arkuszem kalkulacyjnym...
// na przykład: echo '<td>' . $field[$i] . '</td>';
echo '</tr>';
}

Przykład użycia operatora trójdzielnego

Dość często musimy sprawdzić istnienie wartości zmiennej i w razie potrzeby natychmiast jej użyć. Jeśli nie istnieje, chcemy zwrócić wartość domyślną.

Klasycznym podejściem jest zrobienie tego w ten sposób:

$a = 5;
$b = 8;
$c = $a ? $a : $b;

Jeśli zmienna $a istnieje, użyj $a jako wartości, w przeciwnym razie $b.

Czasami jednak otrzymujemy wartość z funkcji:

$a = 5;
$b = 3;
$default = 42;
$c = my_function($a, $b) ? my_function($a, $b) : $default;

Ten sposób wywoływania jest bardzo nieefektywny pod względem zasobów systemowych. Najpierw należy wywołać funkcję, a jeśli istnieje, to wywołuje się ją ponownie, aby uzyskać wartość, która jest przechowywana w zmiennej $c.

To może być lepiej obsługiwane przez zmienną pomocniczą:

$a = 5;
$b = 3;
$helper = my_function($a, $b);
$default = 42;
$c = $helper ? $helper : $default;

Niewłaściwe użycie

Nie zawsze warto używać operatora trójdzielnego, ponieważ ma on tendencję do powodowania zamieszania podczas pisania skomplikowanych i zagnieżdżonych warunków.

Zobaczcie sami przykład:

$valid = true;
$lang = 'Francuski';
$x = $valid
? ($lang === 'Francuski' ? 'oui' : 'tak')
: ($lang === 'Francuski' ? 'nie' : 'z');

Czy na pierwszy rzut oka wiedziałbyś, że zmienna $x będzie zawierała wartość oui?

Po odrobinie praktyki możesz, ale to nie jest właściwa odpowiedź. :)

Sprawdzenie (nie)istnienia wartości i użycie domyślnej

Operatory trójskładnikowe są najpotężniejsze w rutynowym sprawdzaniu (nie)istnienia wartości i używaniu innych domyślnych wartości.

Na przykład, chcemy sprawdzić, czy istnieje główna kategoria dla artykułu i jeśli nie, wyprowadzić komunikat zastępczy:

echo $mainCategory ?? 'Kategoria nie istnieje';

Operator ?? (dwa znaki zapytania) sprawdza czy zmienna $mainCategory istnieje i nie jest null. Działa ona w taki sam sposób jak funkcja isset().

Walidacja pustki wartości

Bardzo często przydatna konstrukcja do sprawdzania, czy wartość wyjściowa nie jest pusta (tzn. nie jest null, 0, false lub `''(empty string)).

Można to zapisać w następujący sposób:

$a = 5;
$b = 3;
$default = 42;
$c = my_function($a, $b) ?: $default;

Najpierw wywoływana jest funkcja($a, $b), następnie testowana jest jej wartość i jeśli nie jest pusta, to od razu przekazywana jest do zmiennej $c, w przeciwnym razie używana jest zmienna $default.

Operator ?: działa jak operator != w warunkowym (fałsz niezależnie od typu danych), a można go zapamiętać wyglądając np. jak uśmiechnięta buźka z włosami Elvisa.

Wsparcie dla starszych wersji PHP

Operator ?: działa od PHP 7. W starszych wersjach musimy zadowolić się warunkiem if (...), który pozwala osiągnąć to samo zachowanie. Pamiętaj, że operatory trójskładnikowe są tak naprawdę tylko skrótem do napisania tego samego, co jest obsługiwane przez warunki.

Nieistnienie wartości można sprawdzić za pomocą funkcji isset(), która sprawdza, czy zmienna istnieje i nie jest pusta (null).

Zamiast kodu:

$a = 5;
$b = 3;
$c = $a ?? $b;

Następnie zapisujemy starszą alternatywę:

$a = 5;
$b = 3;
$c = isset($a) && $a ?? $b;

Ostrzeżenie: Kolejność isset() i samej zmiennej ma znaczenie. Gdybyśmy odwrócili kolejność i zmienna nie istniała, podniosłaby błąd dostępu do nieistniejącej zmiennej.

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
2.
Status:
All systems normal.
2024