73

Possible en double: What are the PHP operators “?” and “:” called and what do they do?Qu'est-ce que c'est?: 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 utilise plusieurs nouvelles fonctionnalités disponibles depuis PHP 5.3:

  1. Le DIR constante
  2. L'opérateur?:
  3. Les fonctions anonymes

  1. Qu'est-ce que le numéro 2 faire avec le : en PHP 5.3?

  2. En outre, que signifient-ils par des fonctions anonymes? N'était-ce pas quelque chose qui existe depuis un moment?

+3

A été répondu au moins deux fois http://stackoverflow.com/questions/1080247/what-is-the-php-operator-called-and-what-does-it-do et http://stackoverflow.com/questions/2099834/quoi-fait-cette-syntaxe-dans-php-signifie – Gordon

+3

@gordon, je sais ce que cela signifie sur ces sujets, je pensais que c'était quelque chose de différent parce que le site disait qu'il était NOUVEAU à partir de 5.3 et aussi jamais vu ensemble comme "?:" – JasonDavis

+0

@Gordon ce ne sont que les formes les plus longues. @jasondavis, vous avez le: et? en arrière dans le titre de la question. – RJFalconer

Répondre

123

?: est une forme de l'opérateur conditionnel qui était auparavant disponible uniquement comme:

expr ? val_if_true : val_if_false 

En 5.3, il est possible de quitter la partie centrale, par exemple expr ?: val_if_false qui équivaut à:

expr ? expr : val_if_false 

De l'manual:

Depuis PHP 5.3, il est possible de laisser la partie centrale de l'opérateur conditionnel. L'expression expr1 ?: expr3 renvoie expr1 si expr1 est évaluée à TRUE et expr3 dans le cas contraire.

+1

Merci! J'étais confus quand je les ai vus ensemble comme ça "?:" Et j'ai cherché mais je n'ai rien trouvé dessus. – JasonDavis

+2

Hmm très cool. Cela rend '?:' Équivalent à '||' en Javascript! – Paulpro

+3

En bonus, vous pouvez les "chaîner": $ foo = $ bar?: $ Bazz?: $ Yadda?: $ Qux; // $ foo va recevoir la valeur de la première variable truthy. Je ne sais pas si c'est une idée terrible (certains n'aiment pas imbriquer les opérateurs ternaires), mais c'est le cas. – MSpreij

35

L'opérateur ?: est le conditional operator (souvent mentionnées comme l'opérateur ternaire):

L'expression (expr1) ? (expr2) : (expr3) évalue à expr2 si expr1 évalue à TRUE et expr3 si expr1 évalue à FALSE.

Dans le cas de:

expr1 ?: expr2 

L'expression est évaluée à la valeur de expr1 si expr1 est vrai et expr2 autrement:

Depuis PHP 5.3, il est possible de omettre la partie médiane de l'opérateur ternaire. L'expression expr1 ?: expr3 renvoie expr1 si expr1 est évalué à TRUE et expr3 sinon.

4

Look here:

Depuis PHP 5.3, il est possible de quitter la partie centrale de l'opérateur ternaire. Expression expr1?: Expr3 renvoie expr1 si expr1 est évalué à TRUE, et expr3 sinon.

fonctions anonymes: Non, ils n'existaient before 5.3.0 (voir la première note en dessous des exemples), au moins de cette façon:

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

La seule façon était create_function(), qui est plus lent, assez encombrant et sujet aux erreurs (à cause de l'utilisation de chaînes pour les définitions de fonctions).