?: operator (l''operatore Elvis') in PHP

L'ho visto oggi in qualche codice PHP:

$items = $items ?: $this->_handle->result('next', $this->_result, $this); 

Non ho familiarità con l'operatore ?: Usato qui. Sembra un operatore ternario, ma l'espressione da valutare se il predicato è vero è stata omessa. Cosa significa?

Valuta l'operando di sinistra se l'operando di sinistra è vero e l'operando di destra altrimenti.

In pseudocodice,

 foo = bar ?: baz; 

approssimativamente risolve a

 foo = bar ? bar : baz; 

o

 if (bar) { foo = bar; } else { foo = baz; } 

con la differenza che la bar verrà valutata solo una volta.

Puoi anche usarlo per fare un "autocontrollo" di foo come dimostrato nell'esempio di codice che hai postato:

 foo = foo ?: bar; 

Questo assegnerà bar a foo se foo è nullo o falso, altrimenti lascerà foo invariato.

Alcuni altri esempi:

 <?php var_dump(5 ?: 0); // 5 var_dump(false ?: 0); // 0 var_dump(null ?: 'foo'); // 'foo' var_dump(true ?: 123); // true var_dump('rock' ?: 'roll'); // 'rock' ?> 

A proposito, si chiama l' operatore Elvis .

Operatore Elvis

Vedi i documenti :

Dal PHP 5.3, è ansible tralasciare la parte centrale dell'operatore ternario. Espressione expr1 ?: expr3 restituisce expr1 ?: expr3 se expr1 ?: expr3 restituisce TRUE ed expr3 contrario.

Fai attenzione agli arrays. Dobbiamo scrivere una variabile di controllo dopo ? , perché:

  $params = ['param1' => 'value1', 'param2' => 'value2', 'param3' => 'value3',]; $param1 = isset($params['param1'])?:null; $param2 = !empty($params['param2'])?:null; $param3 = $params['param3']?:null; // get E_NOTICE, if $params['param3'] eq false var_dump($param1,$param2,$param3); true // would like to expect `value1` true // would like to expect `value2` param3 // properly, but problem above 

aggiornato

Da RFC. In futuro (in PHP 7) l'operatore Null Coalesce Operator lo farà, ad esempio:

 $param1 = $params['param1'] ?? null; // Equivalent to: $param1 = isset($params['param1']) ? $params['param1'] : null; 

Sì, questo è nuovo in PHP 5.3. Restituisce il valore dell'espressione di test se è valutato come TRUE, o il valore alternativo se è valutato come FALSE.

Un'altra considerazione importnte: l'operatore Elvis interrompe il process di tokenizzazione di Zend Opcache. L'ho trovato nel modo più duro! Anche se questo potrebbe essere stato risolto nelle versioni successive, posso confermare che questo problema esiste in PHP 5.5.38 (con Zend Opcache v7.0.6-dev integrato).

Se trovi che alcuni dei tuoi file "rifiutano" di essere memorizzati nella cache in Zend Opcache, questo potrebbe essere uno dei motivi … Spero che questo aiuti!