PHP或运算的一个浅显Bug

前几天赶项目,遍历一组数据,类型是8或9的单独处理,当时是这样写的:

// 片段一
$type = '8';
if ($type != 8 || $type != 9) {
        echo 'do job_b' , PHP_EOL;
} else {
        echo 'do job_a' , PHP_EOL;
}

以上,期望输出”do job_a”, 但是输出的却是”do job_b”, 当时觉得很费解,无赖时间比较紧就换了一个写法:

// 片段二
if (!in_array($type, [8, 9])) {
        echo 'do job_b' , PHP_EOL;
} else {
        echo 'do job_a' , PHP_EOL;
}

以上,输出的是”do job_b”符合预期。

今天回顾的时候,发现之前的这个费解还在,稍微分析下代码片段一就会发现($type != 8)是false, ($type != 9)是true, 所以会进到if中。可是,如果按照人的思维,去想的话,很自然进到else才对啊,感觉被大脑欺骗了。是我的思维有问题,还是人的思维有问题呢?如果代码片段一运行在你的大脑你,10秒输出结果,你会输出什么,欢迎大家留言。

其实更直观的表达是:

// 片段三
if ($type == 8 || $type == 9) {
        echo 'do job_a' , PHP_EOL;
} else {
        echo 'do job_b' , PHP_EOL;
}

以上,输出的是”do job_a”。

发表评论

电子邮件地址不会被公开。 必填项已用*标注