2016-04-06 8 views
12

In primo luogo c'è un nome per questa espressione?Equivalente PHP più veloce di javascript `var a = var1 || var2 || var3;` espressione

Javascript

var value = false || 0 || '' || !1 || 'string' || 'wont get this far'; 

value uguale string (stringa) aka la quinta opzione

PHP

$value = false || 0 || '' || !1 || 'string' || 'wont get this far'; 

$value uguale true (bool)

Ho ragione di pensare che lamodo corretto per ottenere lo stesso risultato di JavaScript è quello di annidare gli operatori ternari? Qual è la soluzione migliore?

+1

Esso è 'true' only..Test' eco vero, ' – Rayon

+0

Si potrebbe desiderare di controllare [questo] (http://stackoverflow.com/questions/5694733/does-php-have-short-circuit -valutazione) out. –

+3

In JS si chiama valutazione di cortocircuito – Xufox

risposta

15

L'operatore equivalente in PHP è ?:, che è la ternary operator senza la parte centrale:

$value = false ?: 0 ?: '' ?: !1 ?: 'string' ?: 'wont get this far'; 

$a ?: $b è un'abbreviazione per $a ? $a : $b.

+0

Penso che la domanda non riguardi l'operatore ternario. Ma l'OP ha confuso l'operatore ternario invece della valutazione di corto circuito. –

+1

In Javascript '||' restituisce * uno dei suoi operandi *, non un booleano. Il modo equivalente per farlo in PHP è '?:'. Risposta alla domanda – deceze

+0

Grazie per la spiegazione. Stavo assumendo qualcos'altro. –

1

Questo test false || 0 || '' || !1 || true || 'wont get this far' restituirà un valore booleano. Restituirà true se uno qualsiasi dei valori è true, è così che funziona OR. Non è un'espressione ternaria, che applica il primo valore valido alla variabile ricevente.

Restituisce 1 in PHP perché non è stata eseguita l'espressione come booleano.

Si potrebbe fare questo per rendere l'espressione restituisce un valore booleano invece di un numero intero nella vostra variabile PHP:

$value = (bool)(false || 0 || '' || !1 || true || 'wont get this far');` 

Il ritorno sarà true.

+0

* "' .. || ..' restituirà un valore booleano ... "*, *" È possibile farlo per fare in modo che l'espressione restituisca un valore booleano ... "* - Cos'è questo? '||' restituisce un valore booleano o no? – deceze

+0

Restituisce un valore booleano, ma non direttamente in una variabile, no in PHP. Non capisco i due downvotes, ma alright – Phiter

+0

Wut? O restituisce un booleano o non lo fa. Non c'è differenza se si assegna il valore di ritorno in una variabile o meno. Un valore è un valore. Il valore di ritorno booleano di '||' non otterrà più il valore booleano mediante il cast. – deceze

1

Se si utilizza PHP 5.3 o versione successiva, vedere deceze's answer.

Altrimenti è possibile utilizzare operatori ternari regolari nidificati.

$value = (false ? false : (0 ? 0 : ('' ? '' : (!1 ? !1 : ('string' ? 'string' : ('wont get this far' ? 'wont get this far' : null)))))); 

Wow questo è brutto.

È possibile utilizzare una matrice di valori;

$array = array(false,0,'',!1,'string','wont get this far')); 

Creare ora una funzione che itera oltre l'array e restituisce il primo valore vero.

function array_short_circuit_eval($vars = array()){ 
    foreach ($vars as $var)if($var)return $var;return null; 
} 

$value = array_short_circuit_eval($array); 

echo $value; // string 
+0

'$ value = current (array_filter (array (false, 0, ...))) - Spero che nessuno debba usarlo, ma eccolo qui ... – deceze

Problemi correlati