PHP中?:与??的区别以及使用方法

一、$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;

下面用具体的数据列出?:与??两者之间的差别:

Expressionecho ($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;truetrue
$x = 1;11
$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)


评论