PHP中if语句赋值语法疑问:改写后的条件判断是否有误?
关于PHP赋值运算符在if条件中使用的错误分析
嘿,你这个改写确实存在问题,核心原因是PHP运算符优先级在搞鬼!
你知道赋值运算符=会返回右侧值这点没错,但你忽略了&&的优先级比=更高。你的代码:
if($oper1 = filter_input(INPUT_POST, 'operand1', FILTER_VALIDATE_FLOAT) && $oper2 = filter_input(INPUT_POST, 'operand2', FILTER_VALIDATE_FLOAT)){
会被PHP解析成:
if($oper1 = (filter_input(...) && $oper2 = filter_input(...))){
这就导致:
$oper1最终拿到的是&&运算后的布尔值(true或false),而不是filter_input返回的浮点数值- 只有当两个
filter_input都返回有效数值时,&&返回true,$oper1被赋值为true(转换成数值是1),此时$oper2是正确的浮点值,但后续计算比如加法就变成1 + $oper2,结果完全不对 - 如果其中一个输入无效,
&&返回false,$oper1被赋值为false(转换成数值是0),后续计算同样出错
正确的写法
给每个赋值表达式加上括号,强制让赋值操作先执行,再进行逻辑与判断:
if( ($oper1 = filter_input(INPUT_POST, 'operand1', FILTER_VALIDATE_FLOAT)) && ($oper2 = filter_input(INPUT_POST, 'operand2', FILTER_VALIDATE_FLOAT)) ){ switch($_POST['op']){ case 'ADD': print $oper1+$oper2; break; case 'SUB': print $oper1-$oper2; break; case 'MUL': print $oper1*$oper2; break; case 'DIV': print $oper1/$oper2; break; } }
这样$oper1和$oper2会先分别拿到filter_input的返回值,再用这两个值进行&&判断(只要有一个是false,条件就不成立),后续的计算也能正确使用输入的浮点数值。
内容的提问来源于stack exchange,提问作者WishSKY
相关产品推荐
相关产品推荐

