细说PHP7中的NULL合并运算符

PHP7中添加了很多新特性,今天主要说一说合并运算符“??”,说这个之前先说说PHP中的其它两个操作符 ?         : 和 ?:, 这两个是三元操作符,什么是三元操作符,三元操作符顾名思义就是要有三个操作数。

语法:条件表达式 ? 表达式1 :表达式2

说明:问号前面的位置是判断的条件,判断结果为 bool 型,为 true 时调用表达1,为 false 时调用表达式2

逻辑:如果为真执行第一个,否则执行第二个

在语法上等效于

if( 条件表达式) {
    表达式1
} else {
    表达式2
}

那 ?? 和 ?             :  有什么区别呢,另外和 ?: 也有什么区别呢。这是今天要学习和记录的,三种运算符的语法格式为:

$b = $a ? : $a : 1;

$b = $a ?: 1;

$b = $a ?? 1;

这里用几段代码来体验一下这三种运算符的区别

<?php
$b1 = $a1 ?: 1;
var_dump( $b1 );

echo "<br><br><br>===================<br><br><br>";

$b2 = $a2 ?? 1;
var_dump( $b2 );

echo "<br><br><br>===================<br><br><br>";

$b3 = $a3 ? $a3 : 1;
var_dump( $b3 );

这情况下,我们并没有定义变量 $a1、$a2、$a3,运行之后发现 $b1 和 $b2、$b3的值都一样,都是运算符后面的那个值(即值为 1)

<?php
$a1 = true;
$b1 = $a1 ?: 1;
var_dump( $b1 );

echo "<br><br><br>===================<br><br><br>";

$a2 = true;
$b2 = $a2 ?? 1;
var_dump( $b2 );

echo "<br><br><br>===================<br><br><br>";

$a3 = true;
$b3 = $a3 ? $a3 : 1;
var_dump( $b3 );

这里把$a1和$a2、$a3的值设置为 true(真), 再一次运行发现$b1和$b2、$b3的值也是一样都是运算符前面的那个值(即值为 true)

<?php
$a1 = false;
$b1 = $a1 ?: 1;
var_dump( $b1 );

echo "<br><br><br>===================<br><br><br>";

$a2 = false;
$b2 = $a2 ?? 1;
var_dump( $b2 );

echo "<br><br><br>===================<br><br><br>";

$a3 = false;
$b3 = $a3 ? $a3 : 1;
var_dump( $b3 );

这里把$a1和$a2、$a3的值设置为 false(假), 再一次运行发现$b1和$b3的值一样为1,而$b2的值却变成 false,说明 ?? 和 三元运算符还是有区别的。

<?php
$a1 = null;
$b1 = $a1 ?: 1;
var_dump( $b1 );

echo "<br><br><br>===================<br><br><br>";

$a2 = null;
$b2 = $a2 ?? 1;
var_dump( $b2 );

echo "<br><br><br>===================<br><br><br>";

$a3 = null;
$b3 = $a3 ? $a3 : 1;
var_dump( $b3 );

这里把$a1和$a2、$a3的值设置为null, 运行之后发现 $b1 和 $b2、$b3的值都一样,都是运算符后面的那个值(即值为 1)。


总结

经常上面的4段代码的比较,发现 ?: 和 ?      :  结果是一样的,这两种运算符完全可以替换使用,至于使用哪个看你的代码风格,唯一的区别是 ?: 的代码量更少一点。

?? 运算符是判断,条件表达式是不是 null, 如果是 null 则值为表达式2,否则就为表达式1,而不管表达式是不是false。(说明一点,如果一个变量没有定义,则判断为 null,这点可以用 var_dump 和  isset 函数判断得出)

但是不管怎么样,?? 和 ?: 还是有区别的,所以在实际使用的时候,特别要注意一点,尤其是??。

未经允许不得转载:易读小屋  »  细说PHP7中的NULL合并运算符