2010-08-27 11 views
11

Uso el operador ternario con bastante frecuencia, pero no he podido encontrar nada en la documentación al respecto y siempre me he preguntado.PHP Ternary operator clarification

El siguiente es un ejemplo posible:

echo ($something->message ? $something->message : 'no message'); 

como se puede ver, si $ algo-> mensaje es correcto, volvemos $ algo-> mensaje, pero ¿por qué escribir dos veces? ¿Hay una manera de hacer algo como:

echo ($something->message ? this : 'no message'); 

Ahora no estoy muy versado en la teoría de la programación, por lo que es posible que exista una razón que el primero no puede hacer referencia a algo como "este", pero ¿Por qué no? ¿Esta línea no fluiría el uso del operador ternario? Para algo así como mi ejemplo es bastante inútil, pero digamos que es

echo (function(another_function($variable)) ? function(another_function($variable)) : 'false'); 

Soy incapaz de encontrar ninguna manera para hacer esto, así que estoy asumiendo que no es posible, si estoy equivocado, por favor informe yo, de lo contrario: ¿por qué no? ¿Por qué esto no es posible, cuál es el motivo técnico, o es algo que nunca sucedió? ¿Debo declararlo como una variable y luego probar contra esa variable?

+0

posible duplicado de [¿PHP tiene un modismo de asignación predeterminado como perl?] (Http://stackoverflow.com/questions/2958630/does-php-have-a-default-assignment-idiom-like-perl) – outis

Respuesta

19

Desde PHP 5.3, es posible omitir la parte central del operador ternario. Expresión expr1?: Expr3 devuelve expr1 si expr1 se evalúa como VERDADERO, y expr3 en caso contrario.

Source

Por ejemplo

$used_value = function1() ?: $default_value; 

es la misma que

$check_value = function1(); //doesn't re-evaluate function1() 
if($check_value) { 
    $used_value = $check_value; 
} else { 
    $used_value = $default_value; 
} 

Palabra para el sabio

Si vas a estar en función de encasillamiento a TRUE Es importante entender lo que va a encasillarse a TRUE y lo que no lo hará. Probablemente valga la pena revisar el type juggling de PHP y leer el type conversion tables. Por ejemplo, (bool)array() es FALSE.

+1

Quien haya enviado ese parche es mi héroe. Estaba leyendo esa página y aparentemente salte directamente sobre esa parte. Gracias, tal vez debería actualizar entonces. ¡Aceptaré tu respuesta cuando el límite de tiempo se acabe! – sam

+0

'echo ($ something-> message?: 'No message');' en el caso del primer ejemplo del OP. –

+1

+1 Deja que php te sorprenda con una oscura implementación del operador ternario de todas las cosas :) tengo que amar las incongruencias .. –