Nowości z php.internals – operator trójargumentowy

Pewnie kilka razy w życiu każdy z nas zetknął się albo i też używał operatora trójargumentowego znanego też jako „ternary operator” bądź „operator Elvisa” (skrócona wersja w Groovym, ciekawe kto wymyślił tą nazwę). Jest to skrócona składnia dla prostego przypadku „if” i wygląda on mniej więcej tak:

$foo = 5;
$bar = ($foo==5) ? "Foo równa się 5" : "Foo nie równa się 5";
echo $bar;

Najczęściej chyba operatora Elvisa używa się by sprawdzić czy jakaś zmienna jest ustawiona, czyli:

$bar = (isset($foo)) ? $foo : 666;
echo $bar; //666

Ostatnio na grupie php.internals toczy się dyskusja czy aby nie uczynić drugiego przypadku domyślnym tj:

$bar = $foo ? $foo: 666;
echo $bar; //666

Dzięki takiej zmianie jest krócej o te kilka uderzeń w klawiaturę by ustawić domyślna wartość jakiej zmiennej. Jest zarówno wielu zwolenników jak i przeciwników tej zmiany. Najważniejsze jednak jest, że Rasmus Lerdorf (BDFL php) uważa, że nie należy zmieniać już istniejącego zachowania ponieważ zrywa to wsteczną kompatybilność kodu. Wobec tego, zaproponowany został kolejny operator w postaci „??” mający to samo zastosowanie co poprzedni oprócz tego, że sprawdza tylko, czy jakaś wartość istnieje:

$value = $a[$key] ?? : 'Not set';

Niektórych też już poniosła fantazja i zaproponowali wersję:

$value = 'Not set' unless $a['key'];

Ciekaw jestem, czy często używacie operatora trójargumentowego, oraz jakie macie zdanie nt. ww. propozycji ?

  1. Robert Gawron pisze:

    Hej,

    IMHO jeśli dana konstrukcja może być wyrażona zwięźle i elegancji przy użyciu istniejącej składni, to nie ma sensu dodawać dla niej nowej składni, której w dodatku trzeba się nauczyć. Marne efekty rozbudowywania lekką ręką składni widać np. w Perlu, np. $|, $$, $< etc.

    pozdrawiam,
    Robert

  2. Niestety niektórzy myślą, że do składni można wepchnąć wszystko aby tylko te kilka literek mniej pisać, ale tak jak napisałeś to droga donikąd. Natomiast dużo trudniejsze jest sensowne zaprojektowanie wszystkiego bez użycia setek słów kluczowych i operatorów. Tak już niestety jest, że zwykle wygrywają rozwiązania gorsze bo są tańsze (przynajmniej na krótką metę).

  3. „Niestety niektórzy myślą, że do składni można wepchnąć wszystko aby tylko te kilka literek mniej pisać”

    Podpisuję się pod tym rękami i nogami. Gdzie te czasy, kiedy programista miał do wyboru kilka poleceń BASICa i mógł zrobić co tylko w duszy mu grało?

  4. @Tomasz: dlatego cała rodzina LISP-owa (Scheme, Clojure) jest taka świetna – tam nie ma składni :)

  5. singles pisze:

    Zamiast zająć się ważnymi rzeczami, to wymyślają takie „udogodnienia”.

    Natomiast, jak już wymyślają udogodnienia to niech w końcu zaimplementują to, które byłoby najwygodniejsze, czyli Array literal.

  6. @singles: albo po prostu zaadoptować notację JSON jako natywną :>

  7. Diabl0 pisze:

    Osobiście lubię skrócone warunki (tak to u nas nazywamy). W wielu miejscach (zwłaszcza szablonach w połączeniu z short echo) czyni kod znacznie czytelniejszym. O wiele szybciej odczytac (i ładniej wygląda)

    <?= isset( $foo ) ? $foo : 'Brak foo' ?>
    

    niż

         
        <?php
        if ( isset( $foo ) ) {
           echo $foo;
        } else {
           echo 'Brak foo';
        }
        ?>
    

    W sumie popieram wszystkie proponowane dodatki poza „unless”. Wygląda jakoś tak mniej czytelnie i imho łatwiej „zgubić” przy wzrokowej analizie kodu. Podobnie jak wszystkie bezbracketowe warunki i pętle – ich analiza bez poprawnego formatowania i podświetlania pasujących bracketów to masakra.

  8. @diablo: jak byś w przyszłości umieszczał kod, to proszę użyj bbcode -> „[ sourcecode lang=”php” ]”, oczywiście bez spacji po braketach 😛

  9. dekoderek pisze:

    Nie wiem, czy to ostatnie to taka fantazja, bo podobna jeśli nie identyczna konstrukcja jest w Ruby. :)

  10. Sebastian Tarach pisze:

    A niedługo dodadzą jeszcze inny operator trójarg.
    $var = $var2 ??? $ ‚istnieje i nie jest pusta’ : ‚nie istnieje i jest pusta’;
    Co za bzdura…

  11. Maks pisze:

    Ja bym był za opcją 2(ta bez nawiasów), mniej pisania i bardziej naturalnie.

    Napisz jeszcze coś o Scali ciekawy język i bardzo spodobały mi się traits jak i sam artykuł z komentarzami.

  12. O Scali na pewno jeszcze coś będzie, spokojna głowa, jak się tylko ze wszystkim odrobię 😉

  13. radex pisze:

    Taaa, tylko to co zmienia? 10 znaków więcej czy mniej, PHP nadal będzie miał „ciężką” i zaśmieconą składnię.

    Nie ma to jak Ruby 😉

  14. Xaerxess pisze:

    Gdyby operatory logiczne && i || nie zwracały boola, tylko ostatnią wartość:

    $some_var = $var || 'brak';
    

    lub jak jest w Perlu („//” to nie komentarz, tylko ‚undefined or’):

    $some_var = $var // 'brak';
    

    nie byłoby tego tematu.

  1. There are no trackbacks for this post yet.

Leave a Reply

Informuj mnie o odpowiedziach poprzez e-mail. Możesz również subskrybować wpis bez zostawiania komentarza.