PHP条件赋值

时间:2017-03-06 15:12:00

标签: php operator-precedence

在Symfony核心中找到了一段有趣的代码

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

!==的优先级高于=但是它在逻辑上如何工作?第一部分是明确的,但其余部分?

我已经创建了一些示例,但它仍然不清楚:sample

1 个答案:

答案 0 :(得分:3)

关键是:作业的左侧必须是变量!在您的示例中实现此目的的唯一可能方法是首先评估赋值 - 这实际上是php的作用。

添加括号表明,会发生什么

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

因此条件为真,如果$route->getHost()的返回值是非空字符串,并且在每种情况下,返回值都分配给$host

此外,您可以查看PHP的grammer

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

如果您仔细阅读了运营商precendence manual页面,您会看到此通知

  

虽然=的优先级低于大多数其他运算符,但PHP会   仍然允许类似于以下的表达式:if(!$ a = foo())in   在哪种情况下,foo()的返回值被放入$ a。