2

重複の可能性:
PHPの三項演算子の問題

私はこの記事でPHPについて少し読んでいましたが、彼の不満の1つを検討するためにしばらく立ち止まりました。いったいどのようにしてPHPがその結果に到達するのか理解できません。

(文字通り!)同様の演算子を持つ他のすべての言語とは異なり、?:は結合性のままです。したがって、この:

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

馬を印刷します。

PHPはどの論理パスをたどり、その結果に'horse'割り当てられ$vehicleますか?

4

2 に答える 2

2

ノート:

三項式を「スタック」することは避けることをお勧めします。1つのステートメント内で複数の三項演算子を使用する場合のPHPの動作は、自明ではありません。

<?php
// on first glance, the following appears to output 'true'
echo (true?'true':false?'t':'f');

// however, the actual output of the above is 't'
// this is because ternary expressions are evaluated from left to right

// the following is a more obvious version of the same code as above
echo ((true ? 'true' : false) ? 't' : 'f');

// here, you can see that the first expression is evaluated to 'true', which
// in turn evaluates to (bool)true, thus returning the true branch of the
// second ternary expression.
?>

http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary

于 2012-06-29T16:06:49.783 に答える
1

ブラケットは、理解と修正の両方のソリューションです。

これにより、意図しない結果が生じるはずです( horse):

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

これにより、意図した結果が得られるはずです(train):

$arg = 'T';   
$vehicle = (
    ( $arg == 'B' ) ? 'bus' : (
        ( $arg == 'A' ) ? 'airplane' : (
            ( $arg == 'T' ) ? 'train' : (
                ( $arg == 'C' ) ? 'car' : (
                    ( $arg == 'H' ) ? 'horse' : 'feet'
                )
            )
        )
    )
);   
echo $vehicle;
于 2012-06-29T16:10:58.033 に答える