为啥这段代码可以正常工作? - 在 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>>)