【问题标题】:Why does this code work correctly? - using equal sign inside an if condition为什么这段代码可以正常工作? - 在 if 条件中使用等号
【发布时间】:2014-08-23 19:10:04
【问题描述】:

为什么这段代码可以正常工作?

function isLoggedIn(){
 return false; //or true
}

if($user = isLoggedIn())
{
 echo "Hello ".$user['name']; //if isLoggedIn returns true, this prints
} else {
 echo "Please login to proceed!";//if isLoggedIn returns false, this prints
}

我一直认为if() 条件中的assignment operator 将始终评估为true,因为它只评估right hand side 的值是否可以分配给left hand side...

【问题讨论】:

  • “为什么这段代码可以正常工作?” - 现在有一个开关。
  • 大声笑,我猜有:p
  • 我注意到你已经从前面给出的答案stackoverflow.com/a/24539850 中得到了它,为什么这里有这个问题?好奇。
  • 我不明白那个答案,并且 cmets 部分会变得太长,只有 OP 的答案,所以我想我会在这里发帖。
  • 我明白了。好吧,看起来你已经得到了你的钱的价值。 ;-)

标签: php if-statement boolean variable-assignment


【解决方案1】:

条件在分配后考虑 $user。
因此,根据 isLoggedIn() 返回的值,它是真还是假

有一个注释。这样的代码将无法按预期工作:

if($var = someFunction() && $var !== 'bad') {}
if($var = someFunction() && $var === 'good') {}

因为 $var 不会包含 someFunction() 返回的值,而是整个表达式的布尔值,像这样:

$var = (someFunction() && $var !== 'bad');
if($var) {}

要得到你需要的结果,你应该使用括号:

if(($var = someFunction()) && $var !== 'bad') {}
if(($var = someFunction()) && $var === 'good') {}

您可以找到详细信息on the php.net website

【讨论】:

  • 感谢您的解释!
【解决方案2】:

在 PHP 中,赋值操作实际上有一个返回值,它就是被赋值的值。您的if() 条件的工作原理与

$x = $y = $z = 42;

有效。该语句会将值42 分配给所有三个变量,并且在功能上等同于

$z = 42;
$y = $z;
$x = $y;

在您的情况下,您的 isLoggedIn() 函数调用将执行并返回一个值。分配给$user 的值。然后将该值“返回”给 if() 语句本身并用于逻辑测试。

如果您的函数返回布尔值 false 或“falsey”值,则“else”子句将被执行。例如

function returns_false() {
   return false;
}

if ($foo = returns_false()) {
   echo 'if was true';
} else {
   echo 'if was false';   // this line will get executed
}

即使分配操作成功,重要的是分配的值,而不是操作的成功/失败。所以“它是假的”代码路径被执行,因为函数调用返回了一个false,它向上传播了决策树。

【讨论】:

    【解决方案3】:

    正如大家已经建议的那样,声明分为两部分:

    1. 它将 isLoggedIn() 的值分配给 $user。
    2. 然后它将相同的值返回给请求它的构造。在这种情况下,它是 返回到 if() 语句。

    值得注意的是,虽然 if() 语句期望接收一个布尔值 true 或 false。如果 if () 接收到的值不是布尔值,那么它在 PHP(以及 JavaScript)中仍然是可以接受的。如果任何运算符或语句接收到错误类型的值,PHP 将在大多数情况下将其转换为 boolean=true。

    【讨论】:

      【解决方案4】:

      因为 IF 为 TRUE,所以它可以工作。奇怪的是,它永远是 TRUE。因为您在仅使用一个 = 符号时分配值。如果要查看内容,必须使用==。

      【讨论】:

        【解决方案5】:

        在将isLoggedIn() 的返回值分配给$user 之后,它正在评估$user 的值。同理:

        $user = isLoggedIn();
        if($user) {}
        

        在循环中特别方便:

        while($var = someFunction()) {
           //do stuff with $var
        }
        

        还有更多的表达方式:

        if($var = someFunction() && $var !== 'bad') {}
        
        if($var = someFunction() && $var === 'good') {}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-10
          • 2014-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多