php中的三元运算符详解

三元运算符的功能与“if....else”流程语句一致,它在一行中书写,代码精练、执行效率高,在PHP程序中恰当地使用三元运算符能够让脚本更为简洁、高效,代码的语法如下:

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

解释:如果条件“expr1”成立,则执行语句“expr2”,否则执行“expr3”.实现同样的功能,若使用条件流程语句,就需要书写多行代码:

  1. if(expr1){
  2. expr2;
  3. }else{
  4. expr3;
  5. }

可见,三元运算符之好并非夸张,可是多数情况下我们只在代码较为简单的时候使用三元运算符,即执行语句只为单句的时候,如:

$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语句简练,以下的语法是正确的,它们以小解引号的方式忽略第二或第三“元”:

  1. $a>$b?print"YES":"";
  2. $a>$b?"":print"No";

应该注意的是:在使用三元运算符时,建议使用print语句替换echo语句-----------经测试,php4环境下,在使用三元运算时若用echo语句打印内容,php会报错.

三元运算符也可以用来赋值:

  1. $a=2;
  2. $b=1;
  3. $str=($a>$b):'Yes':'No';
  4. echo $str;
  5. echo
  6. $a == 1 ? 'one' :
  7. $a == 2 ? 'two' :
  8. $a == 3 ? 'three' :
  9. $a == 4 ? 'foura' : 'other';
  10. echo "n";

结果是:four

一开始想不明白,按照我的理解,应该是这样的逻辑:

  1. echo ($a == 1 ? 'one' :
  2. ( $a == 2 ? 'two' :
  3. ( $a == 3 ? 'three' :
  4. ($a == 4 ? 'four' : 'other'))));
  5. //输出为:two

后来在kevinG(qq:48474)的指教下,参看php手册,终于明白了php的三元符的解释是从左到右的.

  1. <?php
  2. // 乍看起来下面的输出是 'true'
  3. echo (true?'true':false?'t':'f');
  4. // 然而,上面语句的实际输出是't',因为三元运算符是从左往右计算的
  5. // 下面是与上面等价的语句,但更清晰
  6. echo ((true ? 'true' : 'false') ? 't' : 'f');
  7. ?>

所以上面的可以这样解释:

  1. echo (
  2. ((($a == 1 ? 'one' :
  3. $a == 2) ? 'two' :
  4. $a == 3 )? 'three' :
  5. $a == 4 )? 'four' : 'other');

其实这个涉及到类型转换:

$a==1=>false=>$a==2?true=>'two'=true=>'three'=true=>'four'