萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> php中的三元運算符詳解

php中的三元運算符詳解

php教程中的三元運算符詳解


三元運算符的功能與“if....else”流程語句一致,它在一行中書寫,代碼精練、執行效率高。在PHP程序中恰當地使用三元運算符能夠讓腳本更為簡潔、高效。代碼的語法如下:

(expr1)?(expr2):(expr3);

 
解釋:如果條件“expr1”成立,則執行語句“expr2”,否則執行“expr3”。

實現同樣的功能,若使用條件流程語句,就需要書寫多行代碼:

 if(expr1){
expr2;
}else{
expr3;
}
可見,三元運算符之好並非誇張。可是多數情況下我們只在代碼較為簡單的時候使用三元運算符,即執行語句只為單句的時候。如:
 

 $a>$b?print"a大於b":print"a小於b";
事實上,三元運算符可以擴展使用,當設置的條件成立或不成立,執行語句都可以不止一句,試看以下格式:
 

 (expr1)?(expr2).(expr3):(expr4).(expr5);
我們非常明顯地看到,多個執行語句可以使用字符串運算符號(“.”)連接起來,各執行語句用小角括號包圍起來以表明它是一個獨立而完整的執行語句。這樣擴展後它的功能更為逼近“if....else”流程語句。

同時三元運算符還可以嵌套使用。例如,a大於b成立時:如果a小於c,那麼x=c-a否則x=a-c;否則a小於b成立時:如果b小於c,那麼x=c-b否則x=b-c:
 

 $a>$b?$x=($a<$c?$c-$a:$a-$c):$x=($b<$c?$c-$b:$b-$c);
嵌套使用的三元運算符可讀性不好,對日後代碼維護也可能存在問題,但它比“if....else”之類的流程語句相比,它是很簡練了,這是它的好處。

在使用中也可以不考慮“三元”中條件句以外的任意某一“元”,使用三元運算符運算符仍然比if語句簡練。以下的語法是正確的,它們以小解引號的方式忽略第二或第三“元”:
 

 $a>$b?print"YES":"";
 $a>$b?"":print"No";
 
應該注意的是:在使用三元運算符時,建議使用print語句替換echo語句-----------經測試,php4環境下,在使用三元運算時若用echo語句打印內容,php會報錯

 

三元運算符也可以用來賦值:


 $a=2;
 $b=1;
 $str=($a>$b):'Yes':'No';
echo $str;

 

echo
    $a == 1 ? 'one' :
 $a == 2 ? 'two' : 
 $a == 3 ? 'three' :  
 $a == 4 ? 'foura' : 'other';
echo "n";

輸出結果是:

 

 

結果是:four

一開始想不明白,按照我的理解,應該是這樣的邏輯:
echo ($a == 1 ? 'one' :
   ( $a == 2 ? 'two' :
   ( $a == 3 ? 'three' :
    ($a == 4 ? 'four' : 'other'))));
輸出為:two

後來在kevinG(qq:48474)的指教下,參看php手冊,終於明白了php的三元符的解釋是從左到右的,
<!--?php
// 乍看起來下面的輸出是 'true'
echo (true?'true':false?'t':'f');

// 然而,上面語句的實際輸出是't',因為三元運算符是從左往右計算的

// 下面是與上面等價的語句,但更清晰
echo ((true ? 'true' : 'false') ? 't' : 'f');

所以上面的可以這樣解釋:
 echo (
    ((($a == 1 ? 'one' :
 $a == 2) ? 'two' : 
 $a == 3 )? 'three' :  
 $a == 4 )? 'four' : 'other');

  其實這個涉及到類型轉換:
$a==1=>false=>$a==2?true=>'two'=true=>'three'=true=>'four'

copyright © 萬盛學電腦網 all rights reserved