PHP条件赋值

7
在Symfony核心中发现了一段有趣的代码。
if ('' !== $host = $route->getHost()) {
    ...
}

"!==运算符的优先级高于=,但它在逻辑上是如何工作的?前半部分很清楚,但后面呢?我创建了一个小样例,但仍然不清楚:sample"

5
如果 ('' !== ($host = $route->getHost())),则按相同的方式执行。 - JustOnUnderMillions
1
避免使用括号的问题。 - ScaisEdge
1
看这个链接http://sandbox.onlinephpfunctions.com/code/392fb443d315f2fe5e032a8e44c19c8fe3acdc5d,也许你会更加困惑或者完全理解它;-) 但是为了可读性和安全性,请以安全的方式进行操作。顺便说一下,$host = $route->getHost()可以在前一行完成 :-) - JustOnUnderMillions
1
我就是不明白为什么优先级较低的 $host = $route->getHost() 部分会首先被执行? - katona.abel
1个回答

3
重点是:赋值语句的左侧必须是一个变量!在您的示例中实现这一点的唯一可能方法是首先评估赋值 - 这就是php实际执行的操作。
添加括号可以清楚地表明发生了什么。
'' !== $host = $route->getHost()
// is equal to
'' !== ($host = $route->getHost())
// the other way wouldn't work
// ('' != $host) = $route->getHost()

如果$route->getHost()的返回值是非空字符串,并且在每种情况下,返回值都被赋值给$host,则条件为真。
此外,您可以查看PHP的语法
...
variable '=' expr |
variable '=' '&' variable |
variable '=' '&' T_NEW class_name_reference | ...

如果您仔细阅读运算符优先级手册页面,您会看到以下提示:

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


2
同样的原因,WordPress编码标准使用Yoda条件 - Jeff Puckett
谢谢 - 那是我的猜测,但在文档中找不到它。 - katona.abel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接