2017-10-01 4 views
2

Je suis confronté à un comportement inattendu lors de l'utilisation de l'opérateur de coalesce nul nouveau PHP7 avec l'opérateur ternaire.PHP null coalesce + opérateurs ternaires comportement étrange

situation concrète (code fictif):

function a() 
{ 
    $a = 1; 
    $b = 2; 
    return $b ?? (false)?$a:$b; 
} 

var_dump(a()); 

Le résultat est un entier (1).

Quelqu'un peut-il m'expliquer pourquoi?

+4

Pour le bien de ma propre santé mentale et des codeurs à venir en utilisant mon code, je l'utilise toujours explicitement entre parenthèses dans une expression comme celui-ci . J'aime indiquer mon intention et ne pas compter sur la préséance ou d'autres effets secondaires. –

+0

c'est un bon point et mon mauvais, merci – Aldos

Répondre

4

Vos espaces ne reflètent pas la façon dont php évalue l'expression. Notez que le ?? a un higher precedence que l'expression ternaire.

Vous obtenez le résultat de:

($b ?? false) ? $a : $b; 

Ce qui est $a tant que $b n'est pas null ou évalué à false.

+0

je vois, merci – Aldos

3

Examiner la déclaration return $b ?? (false)?$a:$b;

Ce premier résultat qui évalue $b ?? (false) est ensuite passé à ? $a:$b;

$b ?? (false) moyens donnent à la première valeur not null and isset, qui dans ce cas est $b

Depuis $b = 2, qui est une valeur réelle à la rigueur, expression ci-dessus devient:

retour ($b) ? $a : $b qui renvoie la valeur de $a qui est int(1)

Toute cette chose aura un meilleur sens si vous pensez à l'instruction de retour d'origine comme:

retour ($b ?? (false)) ? $a : $b;

Nous ne avez pas besoin d'ajouter des supports supplémentaires parce que ?? est évaluée avant ?

+0

bonne explication détaillée, merci aussi – Aldos