奇怪的行为三元运算符

来自C#我必须在PHP中做一个项目。

我正在使用此代码:

$transport = 'T';

$vehicle = (
 ( $transport == 'B' ) ? 'bus' :
 ( $transport == 'A' ) ? 'airplane' :
 ( $transport == 'T' ) ? 'train' :
 ( $transport == 'C' ) ? 'car' :
 ( $transport == 'H' ) ? 'horse' :
 'feet' );

echo $vehicle;

我希望它能打印train ,但我得到了horse 。 键盘示例:http://codepad.org/rWllfrht

谁能解释这种奇怪的行为?


我不会建议你使用这样的代码,但为了教育目的,它应该是

$transport = 'T';
$vehicle = (
        ($transport == 'B') ? 'bus' : 
            (($transport == 'A') ? 'airplane' : 
                (($transport == 'T') ? 'train' : 
                        (($transport == 'C') ? 'car' : 
                                (($transport == 'H') ? 'horse' : 'feet'))))
        );

echo $vehicle;

一个更好的代码应该是

$transport = 'T';
switch ($transport) {
    case 'A' :
        $vehicle = 'airplane';
        break;
    case 'B' :
        $vehicle = 'bus';
        break;
    case 'C' :
        $vehicle = 'car';
        break;
    case 'H' :
        $vehicle = 'horse';
        break;
    case 'T' :
        $vehicle = 'train';
        break;
    default :
        $vehicle = 'teleportation';
        break;
}

echo $vehicle;

或者更好的是:

$transport = 'T';
$array = array('A'=>'airplane','B'=>"bus","C"=>"car","H"=>"horse","T"=>"train");
echo isset($array[$transport]) ? $array[$transport] : null;

或者,使用数据库:

 SELECT name FROM transpotationTable WHERE someKey = '$transport' 

没有看到关于为什么你的代码在其他答案中被破坏的任何解释,所以这里是一个快速破解。

这里的问题变得更加明显,您可以添加括号来使得评估的隐含顺序更加明确。

下面是你的代码的精简版本,它仍然会产生“马”的错误结果:

 $t = 'T';

 ( $t == 'T' ) ? 'train' : 
 ( $t == 'C' ) ? 'car' : 
 ( $t == 'H' ) ? 'horse' : 'feet';

首先,让我们展开它:

( $t == 'T' ) ? 'train' : ( $t == 'C' ) ? 'car' : ( $t == 'H' ) ? 'horse' : 'feet'; 

接下来,我将添加明确的括号,其中已经有隐含的括号:

((($t == 'T') ? 'train' : ($t == 'C')) ? 'car' : ($t == 'H')) ? 'horse' : 'feet';

接下来,我们可以解决您的比较:

((true ? 'train' : false) ? 'car' : false) ? 'horse' : 'feet';

你应该开始明白为什么这会被打破。 第一个三元组评估为true ? 'train' : 'false' true ? 'train' : 'false''train'

('train' ? 'car' : false) ? 'horse' : 'feet';

因为当'train'到布尔值时'train'是真的,结果现在是'car'

'car' ? 'horse' : 'feet';

再次,因为非空字符串是“真”,结果现在是'马'。 所以,第一次在可怕的嵌套case语句中出现一个true的结果时,结果将级联所有其余的语句,抛出之前的值为下一个运算符的“真实”分支。

解决方案是避免此代码。 这是一个非常聪明的尝试,其结果是一个破碎的,难以理解的混乱。 绝对没有理由使用它。 选择一个switch语句,它的目的就是为了你想要做的事情而构建的。


由于PHP语言语法中存在一个错误,因此无法按预期工作,详见:http://en.wikipedia.org/wiki/%3F:#PHP

这是一个简单的版本,它可以工作:

$transport = 'T';

$vehicle = (
 ( $transport == 'B' ? 'bus' :
 ( $transport == 'A' ? 'airplane' :
 ( $transport == 'T'  ? 'train' :
 ( $transport == 'C'  ? 'car' :
 ( $transport == 'H'  ? 'horse' :
 'feet' ))))));

echo $vehicle;

但正如其他人所说,我同意这不是最好的方式来做到这一点。 你可以使用switch case,if if,或者关联数组,并且可读性更强。

链接地址: http://www.djcxy.com/p/9933.html

上一篇: strange behaviour ternary operator

下一篇: "Open with..." a file on Windows, with a python application