Php 条件中带有赋值的嵌套负if语句

Php 条件中带有赋值的嵌套负if语句,php,if-statement,conditional-statements,variable-assignment,Php,If Statement,Conditional Statements,Variable Assignment,我有以下代码: if (!$x = some_function(1)) { if (!$x = some_function(2)) { return something; } } 我想知道以下哪种说法是等效的: A 或者如果它本质上是说它应该被覆盖,就像这样: B 这个问题的另一种表述方式是:在if语句中的赋值中,变量是先为false求值,然后为iffalse赋值,还是先赋值,接下来计算的变量?感谢Scuzzy的澄清——看起来合适的等价物是: if (some_

我有以下代码:

if (!$x = some_function(1)) {
    if (!$x = some_function(2)) {
        return something;
    }
}
我想知道以下哪种说法是等效的:

A

或者如果它本质上是说它应该被覆盖,就像这样:

B


这个问题的另一种表述方式是:在
if
语句中的赋值中,变量是先为
false
求值,然后为if
false
赋值,还是先赋值,接下来计算的变量?

感谢Scuzzy的澄清——看起来合适的等价物是:

if (some_function(1)) {
    $x = some_function(1));
}
if (!$x && some_function(2)) {
    $x = some_function(2));
}
if (!$x) {
    return something;
}

第一个语句不等同于其他任何语句。这相当于:

$x = some_function(1); // assign $x first
if(!$x){ // check if $x is falsy
  $x = some_function(2); // overwrite $x (not the function itself)
  if(!$x){ // check if $x is still falsy
   // do stuff
  }
}
或者,如果变量不重要,这也是等效的

if(!some_function(1) && !some_function(2)){...}
唯一的区别是第一个始终为
$x
提供一个值,该值可能在其他地方使用

这也是同样的,使用三元

$x = some_function(1) ? some_function(1) : some_function(2);
if(!$x) // do stuff

首先分配给$x,然后是条件测试。而且,分配仍在范围内,因此很容易在不经意间泄漏变量。
if(!some_function(1) && !some_function(2)){...}
$x = some_function(1) ? some_function(1) : some_function(2);
if(!$x) // do stuff