PHP中的三元(条件)运算符和C/C++中的三元(条件)运算符竟然有着不同的结合性(associativity)
之前我一直跟同学描述说,PHP在多个方面跟C语言很像,特别是函数名、标准库的使用,运算符。。。
然而今天遇到一个不同的,那就是三元运算符(ternary),也称作条件运算符。
PHP中条件运算符是左结合的,C/C++中条件运算符是右结合的。
之前我是这样写的:
$type = $p ? $p->type : isset($_GET['type']) ? $_GET['type'] : '';
想要的逻辑功能是:
if(文章不为空) {
返回文章的type
}
else {
if(有type查询) {
返回type查询的值
}
else {
返回空
}
}
,然而事与愿违,由于PHP中条件运算符的左结合性,所以在PHP中是这样理解的:
变量 $has_type 为假
if(文章不为空) {
if(文章的type不为空) {
返回type查询的值
}
else {
返回空
}
}
else {
if(有type查询) {
返回type查询的值
}
else {
返回空
}
}
,仔细想想看,后者的逻辑明显有问题,肯定不是我想要的。
废话了这么多,作个总结吧:
当写类似这样的代码时:
$a ? $b : $c ? $d : $e
PHP中实际意思是:
($a ? $b : $c) ? $d : $e
C/C++中实际意思是(没有$,C/C++程序员比较穷):
a ? b : (c ? d : e)
总之,像有经验的老手告诉的那样,不清楚优先级、结合性时就加个括号吧,准靠谱。
可我为啥犯错了呢。。。因为我是个C/C++程序员,业余的PHP程序员。PHP毕竟是世界上最好的语言,没有之一。我得搞搞她。
参考: