Utilizzo dell'operatore ternario di PHP con solo due argomenti


9

Recentemente stavo rivedendo parte del mio codice e ho notato che in un impeto di distrazione, avevo lasciato una struttura come la seguente:

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

Ora, questo non stava facendo quello che doveva ed è sbagliato , ma poiché quella proprietà è sempre impostata ora funzionava bene, e non c'è nessun errore di sintassi dal 5.3 a causa della seguente modifica :

Da PHP 5.3, è possibile tralasciare la parte centrale dell'operatore ternario. Espressione expr1?: Expr3 restituisce expr1 se expr1 restituisce TRUE e expr3 in caso contrario.

Non ero a conoscenza di questo cambiamento, e ora sono curioso di sapere se dovrei usarlo o meno. Questo è qualcosa che mi mancava molto in lingue come il rubino dove puoi fare ad esempio, a = b || cper ottenere uno bo cpiuttosto un "vero" booleano. Tuttavia, la sintassi che hanno scelto per l'operatore ternario mi sembra un po 'controintuitiva. Dovrei usarlo nel codice di produzione? Mi sono decisamente gettato quando l'ho visto per caso.


Dovresti usare l'operatore null coalescing per quel Varsolp techflirt.com/null-coalescing-operator-php
Ankur Kumar Singh

Risposte:


7

L'operatore condizionale ternario senza il secondo argomento è un po 'romanzo, ma è simile 1 al null coalescenza operatore si trovano in altre lingue Algol-derivati, come C # e Perl, e come si parla, 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 dello spazio dei nomi ( \) è un'indicazione, strane sintassi verranno eventualmente adottate dalla comunità PHP.

Ma uno dei maggiori problemi che le applicazioni PHP tendono ad affrontare è il tempo (a volte) molto lungo tra il rilascio di una nuova versione di PHP e quando gli host iniziano a supportarlo. Ciò porta a problemi in cui è necessario essere retrocompatibili con le versioni precedenti di PHP, rinunciando all'uso di modifiche di praticità come questa.

Se questo non ti riguarda, e il tuo team è d'accordo sul suo utilizzo (o se sei uno sviluppatore solista, se sei a tuo agio con esso), sicuramente provaci. Come il delimitatore dello spazio dei nomi, penso davvero che sarà davvero una questione di quando, non se, sarà accettabile in tutti i futuri progetti PHP.


Nota 1 : ma non identico, dato che gli operatori a coalescenza nulla eseguono il test solo su valori non nulli (e non su valori di verità come PHP), e la ?:sintassi non sopprime le notifiche indefinite, come menzionato nei commenti .


Al momento, la mia "squadra" è composta esclusivamente da me. L'hosting non è un problema poiché generalmente ospitiamo il 98% dei siti che costruiamo e ospitiamo in cima alla 5.3.6. Mi rendo conto che la funzionalità stessa non è così insolita, solo la sintassi per essa che è stata la radice della mia domanda. C'è anche il problema per cui non si comporta come un operatore a coalescenza nulla senza più sintassi ( @per nascondere avvisi su cose indefinite).
Matthew Scharley,

3
@MatthewScharley Se la debacle del delimitatore dello spazio dei nomi (\) è un'indicazione, una strana sintassi non è una barriera all'adozione diffusa in PHP. Si riduce davvero a quando, non se, dovresti iniziare a usarlo.

3

A me sembra un errore nel codice. Sembra sbagliato e, in generale, evito di usare la sintassi che sembra che tu abbia commesso un errore per salvare alcune sequenze di tasti. Quando tu (o qualcun altro) torni a leggere il codice in seguito, penso che quella riga ti farà inciampare e ti farà passare il tempo ad analizzare ciò che sta facendo, per quello che è essenzialmente una semplice operazione.


L'esempio fornito è sbagliato . Un uso corretto della funzionalità come previsto sarebbe $foo = @$bar ?: 'baz'equivalente $foo = (@$bar ? $bar : 'baz'). Sono d'accordo con i tuoi commenti però.
Matthew Scharley,

1

Bene, PHP ha un tipo booleano e l' ||operatore restituisce un valore booleano, quindi in PHP il risultato $a || $bè un valore booleano, questo è coerente con &&come &&ha poco senso restituire l'uno o l'altro ma ha senso restituire true/ false. Avere tutti gli operatori booleani che restituiscono bool sembra anche abbastanza logico.

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

Il || l'operatore deve fornire 1 se uno dei suoi operandi è diverso da 0; in caso contrario, produce 0. Il risultato ha tipo int.

E, bene, dove dovresti usare?: O non è possibile rispondere nella forma generale, ma attenzione: il modo migliore per il linguaggio è usare i costrutti che fornisce e usare i paradigmi che suggerisce. Non ha molto senso scrivere codice Java come codice C o viceversa ;-)


0

Penso che sia un operatore molto utile e dovrebbe sicuramente essere usato poiché lo standard linguistico lo definisce esplicitamente.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.