Php 为什么此代码工作正常?-在if条件中使用等号

Php 为什么此代码工作正常?-在if条件中使用等号,php,if-statement,boolean,variable-assignment,Php,If Statement,Boolean,Variable Assignment,为什么这段代码工作正常 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 }

为什么这段代码工作正常

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操作符
将始终计算为
true
,因为它只是计算
右侧
的值是否可以分配给
左侧

该条件在分配后考虑$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') {}

您可以找到详细信息。

条件在分配后考虑$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') {}

您可以找到详细信息。

在将
isLoggedIn()的返回赋值给
$user
之后,它正在评估
$user
的值。这与:

$user = isLoggedIn();
if($user) {}
它在循环中特别方便:

while($var = someFunction()) {
   //do stuff with $var
}
还有更多的表达:

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

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

在将
isLoggedIn()
的返回赋值给
$user
之后,它正在评估
$user
的值。这与:

$user = isLoggedIn();
if($user) {}
它在循环中特别方便:

while($var = someFunction()) {
   //do stuff with $var
}
还有更多的表达:

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

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

它之所以有效是因为IF是真的。奇怪的是,这永远都是真的。因为您在仅使用一个=符号时正在赋值。如果要检查内容,必须使用==。

它有效,因为If为TRUE。奇怪的是,这永远都是真的。因为您在仅使用一个=符号时正在赋值。如果要检查内容,必须使用==。

正如大家所建议的,该语句有两个部分:

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

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

    正如大家所建议的,该语句有两部分:

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

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

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

    $x = $y = $z = 42;
    
    工作。此语句将为所有三个变量分配值
    42
    ,在功能上等同于

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

    如果您的函数返回了布尔值false或“false”值,那么“else”子句就会执行。e、 g

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

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

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

    $x = $y = $z = 42;
    
    工作。此语句将为所有三个变量分配值
    42
    ,在功能上等同于

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

    如果您的函数返回了布尔值false或“false”值,那么“else”子句就会执行。e、 g

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

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

    “为什么这个代码工作正常?”-现在有一个开关。哈哈,我想是这样的:pI注意到您从前面给出的答案中获取了它为什么这里的问题?好奇。我不理解这个答案,评论部分会变得太长,只有OP的答案,所以我想我应该在这里发布。我理解。好吧,看来你的钱的价值已经低于了“为什么这个代码工作正常?”-现在有一个开关。哈哈,我想是这样的:pI注意到你从前面给出的答案中得到了它为什么这里的问题?好奇。我不理解这个答案,评论部分会变得太长,只有OP的答案,所以我想我应该在这里发布。我理解。好吧,看来你的钱的价值已经低于了谢谢你的解释!谢谢你的经验