2017-03-06 4 views
6

Trouvé une pièce intéressante de code dans Symfony noyauPHP transfert conditionnel

if ('' !== $host = $route->getHost()) { 
    ... 
} 

La priorité de! == est plus élevé que les = mais comment fonctionne-t-il logique? La première partie est claire mais le reste?

J'ai créé un petit échantillon, mais il est toujours pas clair: sample

+5

Do it la méthode sûre si '('' == ($ host = $ route-> getHost())) {' – JustOnUnderMillions

+1

problème éviter d'utiliser entre parenthèses .. – scaisEdge

+1

double possible de [JS vs PHP: cession priorité de l'opérateur lorsqu'il est utilisé avec logique-ou] (http://stackoverflow.com/questions/32672016/js-vs-php-assignment-operator-precedence-when-used-with-logical-ou) – ShiraNai7

Répondre

3

Le point est: Le côté gauche d'une affectation doit être une variable! La seule façon possible d'y parvenir dans votre exemple est d'évaluer l'affectation en premier - ce que fait réellement php.

parenthèses Ajout indique clairement, ce qui se passe

'' !== $host = $route->getHost() 
// is equal to 
'' !== ($host = $route->getHost()) 
// the other way wouldn't work 
// ('' != $host) = $route->getHost() 

Ainsi, la condition est vraie, si la valeur de retour de $route->getHost() est une chaîne non vide et dans chaque cas, la valeur de retour est affecté à $host.

De plus, vous pourriez avoir un oeil aux grammer de PHP

... 
variable '=' expr | 
variable '=' '&' variable | 
variable '=' '&' T_NEW class_name_reference | ... 

Si vous lisez l'opérateur precendence manual page attentivement, vous verrez cet avis

Bien que = a une priorité inférieure que la plupart des autres opérateurs, PHP permet toujours des expressions similaires à ce qui suit: if (! $ a = foo()), dans auquel cas la valeur de retour de foo() est mise dans $ a.

+2

même raison que les normes de codage wordpress utilisent [conditions de yoda] (https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/#yoda-conditions) –

+0

Merci - c'était ma conjecture mais ne pouvait pas le trouver dans les docs –