texto - ?: operador(el ''operador de Elvis'') en PHP
string strip_tags (5)
Vi esto hoy en algunos códigos PHP:
$items = $items ?: $this->_handle->result(''next'', $this->_result, $this);
No estoy familiarizado con el operador ?:
Que se usa aquí. Parece un operador ternario, pero se ha omitido la expresión para evaluar si el predicado es verdadero. Qué significa eso?
Evalúa al operando izquierdo si el operando izquierdo es truthy , y el operando derecho si no.
En pseudocódigo,
foo = bar ?: baz;
resuelve aproximadamente a
foo = bar ? bar : baz;
o
if (bar) {
foo = bar;
} else {
foo = baz;
}
con la diferencia de que la bar
solo se evaluará una vez.
También puede usar esto para hacer una "autocomprobación" de foo
como se demuestra en el ejemplo de código que publicó:
foo = foo ?: bar;
Esto asignará una bar
a foo
si foo
es nulo o falsey, de lo contrario dejará foo
sin cambios.
Algunos ejemplos más:
<?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''
?>
Por cierto, se llama operador de Elvis .
Otra consideración importante: El Operador de Elvis rompe el proceso de tokenización de Zend Opcache. ¡Encontré esto de la manera difícil! Si bien esto puede haberse solucionado en versiones posteriores, puedo confirmar que este problema existe en PHP 5.5.38 (con Zend Opcache incorporado v7.0.6-dev).
Si encuentra que algunos de sus archivos "se niegan" a ser almacenados en caché en Zend Opcache, esta puede ser una de las razones ... ¡Espero que esto ayude!
Sí, esto es nuevo en PHP 5.3. Devuelve el valor de la expresión de prueba si se evalúa como VERDADERO o el valor alternativo si se evalúa como FALSO.
Tenga cuidado con las matrices. Debemos escribir una variable de verificación después ?
, porque:
$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
Actualizado
De RFC. En el futuro (en PHP 7), el operador Null Coalesce Operator lo hará, por ejemplo:
$param1 = $params[''param1''] ?? null;
// Equivalent to: $param1 = isset($params[''param1'']) ? $params[''param1''] : null;
Ver los documentos :
Desde PHP 5.3, es posible omitir la parte central del operador ternario. Expresión
expr1 ?: expr3
devuelveexpr1
siexpr1
evalúa comoTRUE
, yexpr3
caso contrario.