为啥这段代码可以正常工作? - 在 if 条件中使用等号

Posted

技术标签:

【中文标题】为啥这段代码可以正常工作? - 在 if 条件中使用等号【英文标题】: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 我注意到你已经从前面给出的答案***.com/a/24539850 中得到了它,为什么这里有这个问题?好奇。 我不明白那个答案,并且 cmets 部分会变得太长,只有 OP 的答案,所以我想我会在这里发帖。 我明白了。好吧,看起来你已经得到了你的钱的价值。 ;-) 【参考方案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】:

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

    它将 isLoggedIn() 的值分配给 $user。 然后它将相同的值返回给请求它的构造。在这种情况下,它是 返回到 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') 

【讨论】:

以上是关于为啥这段代码可以正常工作? - 在 if 条件中使用等号的主要内容,如果未能解决你的问题,请参考以下文章

为啥这段代码可以正常工作? (vector.clear(), vector<vector<int>>)

有人能告诉我为啥这段代码似乎可以工作,但不能……拜托?

在导航栏中使 SearchBar 更高

为啥这个 `else` 块可以工作,但它与 `if` 情况不在同一级别? [复制]

为啥我的 php 中的多语言网站不能正常工作?

为啥这个python中最大的主要因素的代码不能正常工作