Natknęłam się ostatnio na ciekawą rzecz.
Prawie każdy zna wywodzący się z C operator warunkowy (?:). Dla przypomnienia – jedyny trójargumentowy operator – świetnie zastępuje if…else… – przynajmniej w prostych przypadkach.
Przykład zastosowania:
$a = 10;
$b = ($a > 4) ? 100 : 200;
Wówczas zmienna $b zależnie od wartości zmiennej $a przyjmie:
wartość 100 – jeśli zmienna $a będzie większa niż 4
wartość 200 – jeśli zmienna $a będzie mniejsza lub równa 4.
W powyższym przykładzie $a jest większe niż 4 więc zmienna $b przyjmie wartość 100.
Myślałam, że to wszystko jeśli chodzi o operator ?: – do wczoraj.
Kiedy to okazało się, że argumentami tego operatora mogą być funkcje i to w całkiem inny sposób niż robiłam to do tej pory.
Kolejny przykład:
function inkrementacja($i)
{
return ++$i;
}
function dekrementacja($i)
{
return —$i;
}
$a = 10;
$b = ($a > 4) ? 'inkrementacja' : 'dekrementacja';
$b = $b($a);
Co się stanie?
Jeśli zmienna $a będzie większa od 4, zmiennej $b zostanie przypisany wynik wyrażenia: inkrementacja($a).
Jeśli zmienna $a będzie mniejsza lub równa 4, zmiennej $b zostanie przypisany wynik wyrażenia: dekrementacja($a).
I tak w tym przypadku wartość zmiennej $b wyniesie 11.
Dlaczego nie zrobić tego tradycyjnie?
Tradycyjnie wyglądałoby to tak:
function inkrementacja($i)
{
return ++$i;
}
function dekrementacja($i)
{
return —$i;
}
$a = 10;
$b = ($a > 4) ? inkrementacja($a) : dekrementacja($b);
Zmienna $b przyjmuje teraz wartość 11.
Jaka jest wyższość wcześniejszego rozwiązania nad tradycyjnym? Moim zdaniem – spora, choć jeszcze nie znalazłam na to konkretnego zastosowania, ale jestem pewna, że się przyda. Nie-tradycyjne tworzy minifunkcję – można wielokrotnie sprawdzać warunek ($a > 4) i przypisywać zmiennej $b – bądź jakieś innej zmiennej wartości zwracane przez funkcje inkrementacja i dekrementacja. Jak to?
Można wielokrotnie później wywoływać $b($a) podstawiając za $a coraz to nowe wartości.
Natomiast tradycyjne rozwiązanie pozwala tylko raz sprawdzić warunek i raz dokonać podstawienia.
Wszystko więc zależy od potrzeb.
Nawiasem – nie znalazłam żadnych udokumentowanych źródeł pozwalających dokonać czegoś takiego w C – choć w końcu PHP napisano w C. Co prawda próbowałam eksperymentować i z moich doświadczeń wynika, że zastosowanie tej “innej” składni w C nie jest możliwe;)
To tylko pogłębia moją sympatię do PHP.