【问题标题】:PHP conditional assignmentPHP条件赋值
【发布时间】:2017-03-06 15:11:59
【问题描述】:

在 Symfony 核心中发现一段有趣的代码

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

!== 的优先级比 = 高,但它在逻辑上是如何工作的?第一部分很清楚,剩下的呢?

我创建了一个小示例,但仍不清楚:sample

【问题讨论】:

标签: php operator-precedence


【解决方案1】:

重点是:赋值的左边必须是一个变量!在您的示例中实现此目的的唯一可能方法是首先评估分配 - 这是 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 中。

【讨论】:

  • 同样的原因 wordpress 编码标准使用yoda conditions
  • 谢谢 - 这是我的猜测,但在文档中找不到
猜你喜欢
  • 2012-08-23
  • 2010-11-21
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 2012-01-05
相关资源
最近更新 更多