2011-11-11 18 views
9

Dada la siguiente expresión:La omisión de la segunda parte del operador ternario

$att['menutext'] = isset($attrib_in['i_menu_text']) ? : $this->getID(); 

Si se evalúa como verdadera, se puede configurar para $att['menutext']true o $this->getID()?

+0

Esto no se ejecutará, es una sintaxis no válida. 'Error de análisis: error de sintaxis, inesperado ':' en la línea X' – nickb

+0

No en PHP 5.3. http://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary –

+0

Eso explica por qué no funcionó en 5.2.5 :) – nickb

Respuesta

2

Es lo mismo que la siguiente

$att['menutext'] = isset($attrib_in['i_menu_text']) ? true : $this->getID();

+10

Solo para aclarar a los transeúntes , esta versión abreviada del operador de ternery devuelve lo que evalúa la condición, no solo Boolean 'true' en cada instancia. En este caso, la condición se evaluaría como 'verdadera'. Pero si tuvieras '$ foo = 42? : falso; ',' $ foo' se asignaría '42'. – Wiseguy

+0

Estoy particularmente impresionado con el hecho de que esta respuesta y comentario realmente respondieron a la pregunta que ** quise ** hacer, así como la que ** hice **, pregunte –

+0

. Esta respuesta es incorrecta, no hay 'isset' implícito. – chx

0

Esto no va a ejecutar, que es una sintaxis no válida para PHP 5.3 <.

Parse error: syntax error, unexpected ':' on line X

Si desea que el valor que se establece en true, a continuación, utilizar cierto:

$att['menutext'] = isset($attrib_in['i_menu_text']) ? true : $this->getID(); 

O puede ser más probable que usted desee:

$att['menutext'] = isset($attrib_in['i_menu_text']) ? $attrib_in['i_menu_text'] : $this->getID(); 
14

Según this reference:

Since PHP 5.3, it is possible to leave out the middle part of the ternary operator. Expression expr1 ?: expr3 returns expr1 if expr1 evaluates to TRUE, and expr3 otherwise.

+0

eso es inteligente, gracias –

1

Nunca probado antes, pero es bastante fácil de probar:

<?php var_dump(TRUE ? : 'F'); ?> 

y su dice: bool (true)

2

Sí, en la versión 5.3+ la expresión media es opcional y devuelve verdadero.

$a = (true ? : 1); // $a evaluates to true. 
$a = (false ? : 1); // $a evaluates to 1. 
+1

Solo para aclarar a los transeúntes, esta versión abreviada del operador ternery devuelve lo que evalúa la condición, no solo Boolean 'true' en cada instancia. En este caso, la condición se evaluaría como 'verdadera'. Pero si tuvieras '$ foo = 42? : falso; ',' $ foo' se asignaría '42'. – Wiseguy

+0

¿Hay alguna manera de usar la primera expresión como resultado de la segunda o la tercera? Como '$ db-> get ('id', 'users', 'id', $ id)? previous_query: anything_else'. Ahora tiene que escribir '$ db-> get ('id', 'users', 'id', $ id)? $ db-> get ('id', 'users', 'id', $ id): anything_else'. Lo cual hace dos solicitudes al db. Podrías guardarlo en vars antes de eso, pero no es todo lo que quiero decir. ¿Imposible? –

Cuestiones relacionadas