一、$x ?: $y;
从PHP 5.3+开始,就支持较短的三元运算符语法(?:),省略三元运算符的中间部分从而实现简写。
这种简写语法被成为evlis运算符,下面我们用evlis运算符,三元运算符以及常规的if else结构进行对比。
注意:这里的$x和$y是指任意类型的数据
//使用elvis运算符
$x ? : $y;
//使用三元运算符
$x ? $y : $x;
//使用if / else
if($x){
return $x;
} else {
return $x;
}关于以上代码可以理解为,当$x条件成立如果为0或者false均被视为条件不成立,则直接返回$x的结果,不成立,则返回$b。
注意,因为是等同于if else结构,所以$a必须已经有过声明或必须存在,否则代码会报错。
二、$x??$y;
在PHP7中引入了null合并运算符(??),具体语法如下:
$x是不是是null,如果不为null,则返回$x,否则返回$y;
下面用null合并运算符,三元运算符以及常规的if else进行对比。
//作为if语句:
if(isset($a)){
$a;
} else {
$b;
}
//三元运算符:
(isset($a) ? $a : $b);
//null合并运算符
$a ?? $b;下面用具体的数据列出?:与??两者之间的差别:
| Expression | echo ($x ?: 'hello') | echo ($x ?? 'hello') |
|---|---|---|
| $x = ""; | 'hello' | "" |
| $x = null; | 'hello' | 'hello' |
| $x; | 'hello' (and Notice: Undefined variable: x) | 'hello' |
| $x = []; | 'hello' | [] |
| $x = ['a', 'b']; | ['a', 'b'] | ['a', 'b'] |
| $x = false; | 'hello' | false |
| $x = true; | true | true |
| $x = 1; | 1 | 1 |
| $x = 0; | 'hello' | 0 |
| $x = -1; | -1 | -1 |
| $x = '1'; | '1' | '1' |
| $x = '0'; | 'hello' | '0' |
| $x = '-1'; | '-1' | '-1' |
| $x = 'random'; | 'random' | 'random' |
| $x = new stdClass; | object(stdClass) | object(stdClass) |