本着看的精神像Python的“and”一样的短路评估,同时存储检查结果 https://stackoverflow.com/q/39603391/2191572我决定看看如何在 PHP 中最好地解决这个问题,但我遇到了一个问题。
意外
<?php
function check_a()
{
return 'A';
}
function check_b()
{
return 'B';
}
function check_c()
{
return 'C';
}
if($a = check_a() && $b = check_b() && $c = check_c())
{
var_dump($a);
var_dump($b);
var_dump($c);
}
结果是:
bool(true)
bool(true)
string(1) "C"
我想要发生的事情的代码
<?php
function check_a()
{
return 'A';
}
function check_b()
{
return 'B';
}
function check_c()
{
return 'C';
}
// if(($a = check_a()) && ($b = check_b()) && $c = check_c()) // equivalent to line below
if(($a = check_a()) && ($b = check_b()) && ($c = check_c()))
{
var_dump($a);
var_dump($b);
var_dump($c);
}
结果是:
string(1) "A"
string(1) "B"
string(1) "C"
为什么意外例如以这种方式行事?
这是一个问题运算符优先级 http://php.net/manual/en/language.operators.precedence.php. An 赋值表达式返回指定的值 http://php.net/manual/en/language.operators.assignment.php,所以你会期望得到A
and B
对于前两个操作。你得到布尔值的原因true
相反的是&&
运算符的优先级高于赋值运算符,因此在原始表达式中
$a = check_a() && $b = check_b() && $c = check_c()
$a
得到的值check_a() && $b = check_b() && $c = check_c()
,
$b
得到的值check_b() && $c = check_c()
,
and $c
得到的值check_c()
.
表达式check_a() && $b = check_b() && $c = check_c()
, and check_b() && $c = check_c()
返回布尔值true
,因为使用&&
运算符导致表达式被计算为布尔值,并且表达式的所有组件由&&
评估为true
.
为了获得您期望的结果,您可以像以前一样添加括号,or你可以使用and
逻辑运算符代替&&
,因为它的优先级低于赋值运算符。
if($a = check_a() and $b = check_b() and $c = check_c()) {
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)