Utilizzo dell'operatore ternario di PHP con solo due argomenti

9

Di recente stavo rivedendo parte del mio codice e ho notato che in un attacco di distrazione, avevo lasciato una struttura simile alla seguente:

$guid = empty($subscription->guid) ?  : $subscription->guid;

Ora, questo non stava facendo ciò che è necessario e è sbagliato , ma dal momento che quella proprietà è sempre impostata ora funzionava correttamente e non c'è alcun errore di sintassi dal 5.3 a causa di il seguente cambiamento :

Since PHP 5.3, it is possible to leave out the middle part of the ternary operator. Expression expr1 ?: expr3 returns expr1 if expr1 evaluates to TRUE, and expr3 otherwise.

Non ero a conoscenza di questo cambiamento, e ora sono curioso di usarlo o meno. Questo è qualcosa che mi mancava terribilmente da linguaggi come Ruby, dove puoi fare ad esempio, a = b || c per ottenere b o c piuttosto che un 'vero' booleano. Tuttavia, la sintassi che hanno scelto per l'operatore ternario mi sembra un po 'controintuitiva. Dovrei usare questo nel codice di produzione? Mi ha sicuramente gettato quando l'ho visto per caso.

    
posta Matthew Scharley 18.02.2012 - 01:32
fonte

4 risposte

7

L'operatore condizionale ternario senza il secondo argomento è un po 'nuovo, ma è simile 1 al operatore null-coalescing trovato in altri linguaggi derivati da Algol come C # e Perl, e come dici tu, l'operatore || in Ruby (e JavaScript).

All'inizio sembra strano, ma non è troppo là fuori (soprattutto perché c'è un precedente per operatori simili in altre lingue) e può salvare una buona quantità di tasti. E, se ciò che è accaduto con il delimitatore namespace ( \ ) è una qualche indicazione, alla comunità PHP verranno infine applicate delle strane sintassi.

Ma uno dei maggiori problemi che le applicazioni PHP tendono ad affrontare è il (talvolta) terribilmente lungo ritardo tra il rilascio di una nuova versione di PHP e quando gli host iniziano a supportarlo. Questo porta a problemi in cui è necessario essere retrocompatibili con le versioni precedenti di PHP, abbandonando l'uso delle modifiche di comodità come questa.

Se ciò non ti riguarda, e il tuo team è d'accordo sul suo utilizzo (o se sei uno sviluppatore solista, se sei a suo agio con esso), con tutti i mezzi per farlo. Come il delimitatore del namespace, penso davvero che sarà davvero una questione di quando, non se, sarà accettabile in tutti i futuri progetti PHP.

Nota 1 : ma non identici, dato che gli operatori a coalescenza nulla testano solo valori non nulli (e non valori veri come PHP), e la sintassi ?: non sopprime le notifiche non definite come hai citato nei commenti .

    
risposta data 18.02.2012 - 02:00
fonte
3

Per me, sembra un errore nel codice. Sembra sbagliato e, in generale, evito di usare la sintassi che sembra aver commesso un errore per salvare poche battute. Quando tu (o qualcun altro) tornerai a leggere il codice in seguito, penso che quella linea ti farà inciampare e ti costringerà a sprecare tempo a analizzare ciò che sta facendo, per quella che è essenzialmente una semplice operazione.

    
risposta data 18.02.2012 - 17:06
fonte
1

Bene, PHP ha un tipo booleano e l'operatore || restituisce un boolen, quindi in PHP il risultato di $a || $b è un booleano, questo è coerente con && come con && ha poco senso restituisce uno o l'altro, ma ha senso restituire true / false . Anche il fatto che tutti gli operatori booleani restituiscano bool sonori abbastanza logici.

Inoltre, questa non è un'invenzione da PHP, ma è la seguente: C, da cui provengono molti elementi di design del PHP "classico". Citando da §6.5.14 dello standard C99:

The || operator shall yield 1 if either of its operands compare unequal to 0; otherwise, it yields 0. The result has type int.

E, beh, che si dovrebbe usare?: o non si può rispondere in forma generale, ma la mente: il modo migliore per usare la lingua è usare i costrutti che fornisce e usare i paradigmi che suggerisce. Non ha molto senso scrivere codice Java come il codice C, o viceversa; -)

    
risposta data 18.02.2012 - 19:48
fonte
0

Penso che sia un operatore molto utile e dovrebbe essere sicuramente utilizzato poiché lo standard del linguaggio lo definisce esplicitamente.

Si noti che è ufficialmente chiamato Elvis Operator in Grooy (perché? basta guardarlo da vicino!), ed era stato proposto di essere introdotto in Java 7.

    
risposta data 19.02.2012 - 11:51
fonte

Leggi altre domande sui tag