Eu evit să folosesc astfel de condiții. De fapt, le folosesc doar dacă e vorba de o singură verificare, ceva simplu. Nu folosind o condiție într-alta. Devine ambiguă, greu de analizat etc.
Dacă un programator ar crea un script folosind numai sintaxe dintr-astea, următorul programator care ar intra în script ar înjura.
Iar referitor la cod, a doua evaluare mi se pare suficient de clară.
Prima evaluare, mi-e puțin rușine, dar vă spun… Singura valoare la care n-aș fi crezut că se poate ajunge este Urgent Curier.
Mie nu mi se pare deloc greu de citit un astfel de cod, ba dimpotrivă, mai ales dacă e grupat şi indentat corespunzător. Pot să fie şi 100 de condiţii înlănţuite, un cârnat de if-uri ar fi infinit mai greu de urmărit.
Mi se pare mai elegant, mai ușor de citit, mai curat iar efortul necesar pentru a parsa mental codul este mult mai mic.
Eventual ai putea folosi un switch, dar ajungi să ai un cârnat de cod care va arăta și mai urât decât ternary-ul tău (dar tot va fi mai ușor de citit).
Hehe, evident că exemplul meu este unul extrem, ca să arăt că nu e aşa dificil de “parsat” ochiometric o astfel de construcţie, dacă e scrisă cum trebuie. Pentru lookups e clar că map-ul e mult mai potrivit.
Ideea e că uneori ai “bigger fish to fry” şi vrei să scrii codul neimportant cât mai compact (eventual pe o singură linie), ca să nu-ţi stea în cale în înţelegerea lucrurilor cu adevărat importante. Cel puţin aşa am remarcat eu în practică, dacă fac “unfold” la cod doar ca să fiu pedant, codul meu începe să arate mult mai complex decăt este în realitate.
Exista un mod de a evalua diverse conditii mai readable. Nu recomand folosirea decat in cazuri in care orice alta metoda de a scrie cod usor de parcurs a dat gres.
$someVariable = '';
$anotherVariable = ['abc', 'def', 'g'];
switch (true) {
case (! is_string($someVariable) || ! is_array($anotherVariable)):
echo ('type check failed!');
break;
case (0 == strlen($someVariable) && 0 == count($anotherVariable)):
echo('we are dealing with empty values!');
break;
// etc
}
Să zicem că este un unexpected behaviour, în special dacă vii din lumile altor limbaje. Îmi scapă motivele pentru care implementatorii PHP-ul s-au gândit că ar fi o idee genială să facă evaluarea operatorilor ternari într-un mod complet contraintuitiv. E un feature cam bizar
Acum mulţi ani (probabil pe vremea lui php 3 sau 4) am senzaţia că m-am lovit de un alt feature bizar, tot legat de operatorul ternar. Era ceva de genul:
function test()
{
return true ? 1 : 2;
}
Iar test(), in loc sa returneze “1” sau “2”, in funcţie de condiţie, îmi returna rezultatul condiţiei în sine (!!!), “true” în cazul asta. De atunci m-am obişnuit să incadrez mereu între paranteze tipul astă de expresie.