2010-01-03 22 views
123

vi esto hoy en algún código PHP:operador?: (El "operador de Elvis) en PHP

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

No estoy familiarizado con el operador ?: se utiliza aquí. Parece un operador ternario, pero se ha omitido la expresión para evaluar si el predicado es verdadero. Qué significa eso?

Respuesta

237

Evalúa al operando izquierdo si el operando izquierdo es truthy, y el operando derecho de lo contrario.

En pseudocódigo,

foo = bar ?: baz; 

resuelve más o menos a

foo = bar ? bar : baz; 

o

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

con la diferencia que bar sólo se evalúa una vez.

También puede usar esto para hacer un "auto-check" de foo como se demuestra en el ejemplo código que envió:

foo = foo ?: bar; 

Esto asignará bar a foo si foo es nulo o Falsey-, de lo contrario saldrá de 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 la Elvis operator.

Elvis operator

+7

Asegúrate de que la variable entre paréntesis existe, o vas a generar un error. PHP no solo asumirá que tiene un valor de 'null' o algo así. Solo digo – DanMan

+10

Lo curioso es que esta respuesta forma un ciclo recursivo con el artículo de Wiki, que no explicaba por qué se llamaba el "operador de Elvis". – fayerth

+0

http://emoticon.wikia.com/wiki/Elvis_Presley –

42

Ver the docs:

A partir de PHP 5.3, es posible dejar de lado la parte media del operador ternario. Expresión expr1 ?: expr3 devuelve expr1 si expr1 evalúa a TRUE, y expr3 en caso contrario.

+4

Necesitan un nuevo escritor de doc porque inevitablemente alguien preguntará qué pasó con expr2. Yo solo lo puse. –

2

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.

+2

Subtly wrong/engañoso; ninguno de los operandos debe ser booleano. Lo que importa es si el primer valor es * verdad *, no si es 'VERDADERO'. –

+0

@MarkAmery aclarado. Debería ser bastante difícil malinterpretarlo de esta manera. – Atli

7

tener cuidado con las matrices. Debemos escribir una variable de comprobación después de ?, 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) Null Coalesce Operator operador lo hará, por ejemplo:

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

Esto no responde la pregunta, ni es útil para cualquiera que intente entender cuándo usar el Operador de Elvis. –

+3

@Mark Amery hmm .. ¿En serio? No es útil? ¿De verdad trabajaste con PHP y ves miles de casos en el uso para acceder a los vars de array con ternary? De acuerdo, cambié el texto a "Ten cuidado con las matrices ..." – voodoo417

+0

por lo que nulo coalesce y elvis son lo mismo? –

2

Otra consideración importante: El operador Elvis rompe el proceso de tokenización 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!