73

Duplicar posible: What are the PHP operators “?” and “:” called and what do they do?¿Qué es?: En PHP 5.3?

De http://twitto.org/

<?PHP 
    require __DIR__.'/c.php'; 
    if (!is_callable($c = @$_GET['c'] ?: function() { echo 'Woah!'; })) 
     throw new Exception('Error'); 
    $c(); 
?> 

Twitto utiliza varias características nuevas disponibles a partir de PHP 5.3:

  1. El DIR constante
  2. El operador?:
  3. funciones anónimas

  1. ¿Qué número 2 hacer con el :? en PHP 5.3?

  2. Además, ¿qué significan con funciones anónimas? ¿No era eso algo que ha existido por un tiempo?

+3

Se ha respondido al menos dos veces http://stackoverflow.com/questions/1080247/what-is-the-php-operator-llamado-y-what-does-it-do y http://stackoverflow.com/questions/2099834/what-does-this-syntax-in-php-mean – Gordon

+3

@gordon, sé lo que eso significa en esos temas, pensé que esto era algo diferente porque el sitio decía que era NUEVO a partir del 5.3 y también Nunca los he visto juntos como "?:" – JasonDavis

+0

@Gordon esos son solo los formularios más largos. @jasondavis, tienes el: y? hacia atrás en el título de la pregunta. – RJFalconer

Respuesta

123

?: es una forma de que el operador condicional que estaba disponible anteriormente sólo como:

expr ? val_if_true : val_if_false 

En 5.3 es posible dejar de lado la parte media, por ejemplo, expr ?: val_if_false lo que equivale a:

expr ? expr : val_if_false 

Desde el manual:

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

+1

¡Gracias! Estaba confundido cuando los vi juntos así "?:" Y busqué pero no pude encontrar nada en él. – JasonDavis

+2

Hmm muy genial. Eso hace '?:' Equivalente a '||' en Javascript! – Paulpro

+3

Como una ventaja adicional, puede "encadenarlos": $ foo = $ bar?: $ Bazz?: $ Yadda?: $ Qux; // $ foo se le asignará el valor de la primera variable de verdad. No estoy seguro de si esta es una idea terrible (algunos operadores ternarios de anidación no les gusta), pero ahí está. – MSpreij

35

El operador ?: es el conditional operator (a menudo referido como el operador ternario):

La expresión (expr1) ? (expr2) : (expr3) evalúa a expr2 si expr1 evalúa a TRUE, y expr3 si expr1 evalúa a FALSO.

En el caso de:

expr1 ?: expr2 

la expresión se evalúa el valor de expr1 si expr1 es cierto y expr2 de otro modo:

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

4

Look here:

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

funciones anónimas: No, no existían before 5.3.0 (ver la primera nota por debajo de los ejemplos), al menos de esta manera:

function ($arg) { /* func body */ } 

La única manera era create_function(), que es más lento, bastante engorroso y propenso a errores (debido al uso de cadenas para definiciones de funciones).

Cuestiones relacionadas