??与?:的区别?

?? 前面判断返回 bool 表示状态,true 等式等于前面的值,false 等式等于后面的值
?:只判断值,值为真则使用前面的值,否则使用后面的
$a?? 相当于 isset($a)?$a:

<?php
$a = 0;
echo false; //无
echo $a==1 ?? 2;//无
echo $a ?? 2;//0
echo $a ?: $a = 2;//2

echo $b ?? $b = 2;//2
echo $b ?: $b = 2;//2

怎么改成问答帖啊…

本作品采用《CC 协议》,转载必须注明作者和本文链接
保持专注
白小二
讨论数量: 11

?? 相当于 empty($n) ?:

3个月前
白小二

@勇敢的心 $a?? 相当于 isset($a)?$a:

3个月前

没弄明白别误导别人啊

?? 前面判断返回 bool 表示状态,true 等式等于前面的值,false 等式等于后面的值,这句话是错误的

?? 的主要作用是判断是否存在,也可以判断变量是否为null,变量值为truefalse没有任何影响,我用这个还是挺多的,主要判断变量为null数组对象补默认值的时候。

// 为定义 $foo 变量并不会报错
 var_dump($foo ?? 'bar'); // bar

$foo = false;
var_dump($foo ?? 'bar'); // false

$foo = null;
var_dump($foo ?? 'bar'); // bar

$foo = [];
var_dump($foo['bar'] ?? ''); // 不会报错
3个月前
echo $a ?: $a = 2;//2

echo $b ?? $b = 2;//2
echo $b ?: $b = 2;//2

:sweat_smile: 这是什么测试,这不是运算符优先级的问题吗。

3个月前
白小二

@Adachi 你说的也有道理,我只是根据我自己的试验做出的判断,我改为问答贴吧,但是你举得例子也没有反例啊,php 的 null就相当于没定义

$a = null;
echo isset($a);
$a = false;
echo isset($a);
exit();
3个月前
白小二

@Adachi ?? 也可以用于判断等式,根据实验来看的话就是比 ?: 多了一个 状态位 的判断

3个月前

?? 也可以用于判断等式 我是不清楚你是怎么得出的结论,但是我暂时觉得是完全没有道理的事情。 你先看文档,看完介绍之后再实验, 比较运算符

null的问题吧,我觉得是php设计有问题,照字面意思isset 一个为null的变量应该返回true才是,但实际返回了false。不过存在即合理,比如说你要同时判断 null空字符串

3个月前
白小二

@Adachi echo $a==1 ?? 2;//无 判断等式

3个月前 评论
Adachi 3个月前
白小二 (作者) (楼主) 3个月前
Adachi 3个月前
$b = $a ?? 'a';
$b = isset($a) ? $a : 'a';

$b = $a ?: 'a';
$b = empty($a) ? $a : 'a';
3个月前

?? 可以简单的理解为 isset ?: 可以简单的理解为 empty ,有些人不去百度就上去喷的,能百度一下吗?

3个月前
xianyunyehe

官方文档有详细的解释

??null合并运算符

由于日常使用中存在大量同时使用三元表达式和 isset()的情况, 我们添加了null合并运算符 (??) 这个语法糖。如果变量存在且值不为null, 它就会返回自身的值,否则返回它的第二个操作数

$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
//php7
$username = $_GET['user'] ?? 'nobody';

?: 三元运算符

表达式 (expr1) ? (expr2) : (expr3) 在 expr1 求值为 true 时的值为 expr2,在 expr1 求值为 false 时的值为 expr3。 可以省略三元运算符中间那部分。表达式 expr1 ?: expr3 在 expr1 求值为 true 时返回 expr1,否则返回 expr3

$a  = 1;
$b = $a ? $a : 0;
// php7
$b = $a ?: 0;
  • ?? 是合并一个 null运算
  • ?: 合并一个三元运算
2个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!