为什么我在这里通过零错误得到一个分区?
在这行代码中,我得到了一个零错误的除法:
$ratio['p{W}'] = ($ratio['{W}'] === 0) ? 0 : ($colorTotal === 0) ? 0 : ($ratio['{W}'] / $colorTotal) * 100;
我已经用上面的测试过了:
echo '$ratio[{W}]:'.$ratio['{W}'].', $colorTotal:'.$colorTotal;
if($ratio['{W}'] === 0) {
echo('$ratio[{W}]: zero');
}
else {
echo('$ratio[{W}]: not zero');
}
if($colorTotal === 0) {
echo('$colorTotal: zero');
}
else {
echo('$colorTotal: not zero');
}
结果是:
[01-Jul-2015 17:40:26 UTC] $ratio[{W}]:0, $colorTotal:0
[01-Jul-2015 17:40:26 UTC] $ratio[{W}]: zero
[01-Jul-2015 17:40:26 UTC] $colorTotal: zero
看起来我不应该在代码中达到这一点( $ratio['{W}'] / $colorTotal
),因为前面的标准在检查中是0,但它似乎达到了它? 我怎样才能防止这个错误?
三元运算符在PHP中是左关联的。 您的代码相当于:
$ratio['p{W}'] = (($ratio['{W}'] === 0) ? 0 : ($colorTotal === 0)) ? 0 : ($ratio['{W}'] / $colorTotal) * 100;
意思是($ratio['{W}'] === 0) ? 0 : ($colorTotal === 0)
($ratio['{W}'] === 0) ? 0 : ($colorTotal === 0)
首先评估。 这个结果是0
或者是true
,这意味着第二个三元组的真正部分将始终执行。
它看起来像你可能想让整个表达式正确联想:
$ratio['p{W}'] = ($ratio['{W}'] === 0) ? 0 : (($colorTotal === 0) ? 0 : ($ratio['{W}'] / $colorTotal) * 100);
我会开始在你的三元组中加入括号,因为我担心ElGavilan是对的。 你的单行代码很难读,而且是指我们没有的代码,这意味着我们无法测试你的代码。
我喜欢三元组......但不是那样!
$ratio['p{W}'] = ($ratio['{W}'] === 0) ? 0 : ($colorTotal === 0) ? 0 : ($ratio['{W}'] / $colorTotal) * 100;
($ratio['{W}'] === 0)
表示$ratio['{W}']
为false,则在这两种情况下执行错误代码($colorTotal === 0)
($ratio['{W}'] === 0) & ($colorTotal === 0)
值变为0.对于最后一种情况分割情况0/0也是如此。