好讨厌的php三元运算符错误

像以下代码:

$type = 0;
$name = $type == 0 ? “gold” : $type == 1 ? “diamond” : $type == 2 ? “crown” : “”;
echo $name;

它死活输出为crown..像js, java, c++都是输出为gold的..例如:

var type = 0;
var name = type == 0 ? “gold” : type == 1 ? “diamond” : type == 2 ? “crown” : “”;
console.log(name);

相不通为神马php这么例外.

后来我改成:

$type = 0;
$name = $type == 0 ? “gold” : ($type == 1 ? “diamond” : ($type == 2 ? “crown” : “”));
echo $name;

就能输出gold了..

我说php的运算符优先级,还能有些科学依据么?

话说,第一段代码为什么输出的是crown,哪位大神给讲讲???

回复讨论(解决方案)

为了让你知道 php 是谁!(js, java, c++ 都是 c 这个娘生的)
$type = 0;
$name = $type == 0 ? “gold” : ($type == 1 ? “diamond” : ($type == 2 ? “crown” : “”));
echo $name;

$type = 0;
$name = array(“gold”, “diamond”, “crown”);
echo $name[$type];

php 三目运算符是从右到左的。

$name = $type == 0 ? “gold” : $type == 1 ? “diamond” : $type == 2 ? “crown” : “”;

相当于

$name = (($type == 0 ? “gold” : $type == 1 )? “diamond” : $type == 2 )? “crown” : “”;

$type == 0 ? “gold” : $type == 1 的值是gold 等于true

(($type == 0 ? “gold” : $type == 1 )? “diamond” : $type == 2 ) 的值是diamond等于true

所以最后输出crown;

php 三目运算符是从右到左的。

$name = $type == 0 ? “gold” : $type == 1 ? “diamond” : $type == 2 ? “crown” : “”;

相当于

$name = (($type == 0 ? “gold” : $type == 1 )? “diamond” : $type == 2 )? “crown” : “”;

$type == 0 ? “gold” : $type == 1 的值是gold 等于true

(($type == 0 ? “gold” : $type == 1 )? “diamond” : $type == 2 ) 的值是diamond等于true

所以最后输出crown;

牛!!!!!!!!!!!!!!!

很有用,感谢楼主

$type = 0;
$name = array(“gold”, “diamond”, “crown”);
echo $name[$type];

您这个挺好的.

可是有时候就是想用三元运算符,搞成

if

else if

else if

else if

else if

else if

else if

这些玩意.

一不小心就中招!!!!!!!!!!!!!!!!!!!

php 三目运算符是从右到左的。

$name = $type == 0 ? “gold” : $type == 1 ? “diamond” : $type == 2 ? “crown” : “”;

相当于

$name = (($type == 0 ? “gold” : $type == 1 )? “diamond” : $type == 2 )? “crown” : “”;

$type == 0 ? “gold” : $type == 1 的值是gold 等于true

(($type == 0 ? “gold” : $type == 1 )? “diamond” : $type == 2 ) 的值是diamond等于true

所以最后输出crown;

没看懂,应该很高深的样子.

我只死记硬背结果就好了.

习惯就好,都是一些基础点。

你就不能打个括号?

习惯就好,都是一些基础点。

是的,目前比较不太了解脚本语言,无类型,这个有些难.

$v = ’20’;
$v2 = ’30’;
$v3 = $v + $v2; //这里是50了,因为php解释器自动把’20’,’30’转化为了数字.即变成20 + 30.
$b = ‘false’;
echo $b == true ? ‘111’ : ‘000’; //像这个输出’111’就不理解了,为毛php不自动转换为bool类型呢?

这些坑,一不小心,就掉下去…

你就不能打个括号?

我现在都是打括号的.

但之前是怎么也没想到,php如此与众不同嘛.

习惯就好,都是一些基础点。

是的,目前比较不太了解脚本语言,无类型,这个有些难.

$v = ’20’;
$v2 = ’30’;
$v3 = $v + $v2; //这里是50了,因为php解释器自动把’20’,’30’转化为了数字.即变成20 + 30.
$b = ‘false’;
echo $b == true ? ‘111’ : ‘000’; //像这个输出’111’就不理解了,为毛php不自动转换为bool类型呢?

这些坑,一不小心,就掉下去…

写php不需要安装php公司什么exe程序之类,直接随便一个记事本就可以写,在写完保存.php文件时当然也就无从检测你的代码类型语法等是否合规!

易语言 c++ dilphin这些程序语言不存在上面那种问题,因为你写这些语言必须用这些公司专门的exe程序来写啊,当然点保存时它就可以检测提示你的代码是否合格了!

$b = ‘false’;

echo $b == true ? ‘111’ : ‘000’; //像这个输出’111’就不理解了,为毛php不自动转换为bool类型呢?

其实后面的 $b飞true 比较时是转成bool类型了的, 但是字符串 ‘false’ 转成bool类型不就是true了

php的处理是:如果是一个字符串,长度大于0 不等于 !== ‘0’ 都是true

Posted in 未分类