首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP三元运算符与空合并运算符

PHP三元运算符与空合并运算符
EN

Stack Overflow用户
提问于 2016-01-03 06:23:40
回答 4查看 186.6K关注 0票数 467

有人能解释一下PHP中ternary operator shorthand (?:)和null coalescing operator (??)的区别吗?

什么时候它们的行为是不同的,什么时候是相同的(如果真的发生了)?

代码语言:javascript
复制
$a ?: $b

VS.

代码语言:javascript
复制
$a ?? $b
EN

回答 4

Stack Overflow用户

发布于 2016-05-24 01:17:56

当涉及到动态数据处理时,它们的行为是不同的。

如果变量为空( '‘),则null合并将把该变量视为true,但速记三元运算符不会。

代码语言:javascript
复制
$a = NULL;
$c = '';

print $a ?? '1b';
print "\n";

print $a ?: '2b';
print "\n";

print $c ?? '1d';
print "\n";

print $c ?: '2d';
print "\n";

print $e ?? '1f';
print "\n";

print $e ?: '2f';

和输出:

代码语言:javascript
复制
1b
2b

2d
1f

Notice: Undefined variable: e in /in/ZBAa1 on line 21
2f

链接:https://3v4l.org/ZBAa1

票数 18
EN

Stack Overflow用户

发布于 2017-07-09 10:21:37

似乎使用???:都有优点和缺点。支持使用?:的是,它计算的结果是false和null,以及"“相同。缺点是,如果前面的参数为空,它将报告一个E_NOTICE。对于??,优点是没有E_NOTICE,但缺点是它不会计算false和null。在我的经验中,我看到人们开始交替使用null和false,但后来他们最终求助于修改代码,使其与使用null或false一致,但不是两者都使用。另一种方法是创建一个更复杂的三元条件:(isset($something) or !$something) ? $something : $something_else

以下示例说明了同时使用null和false时使用??运算符的区别:

代码语言:javascript
复制
$false = null;
$var = $false ?? "true";
echo $var . "---<br>";//returns: true---

$false = false;
$var = $false ?? "true";
echo $var . "---<br>"; //returns: ---

但是,通过详细介绍三元运算符,我们可以使false或空字符串"“的行为如同它是null一样,而不会抛出e_notice:

代码语言:javascript
复制
$false = null;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: ---

$false = false;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: ---

$false = "";
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: ---

$false = true;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: 1---

就我个人而言,我认为如果PHP的未来版本包含另一个新的运算符::?来取代上面的语法,那就太好了。// $var = $false :? "true";语法将对null、false和"“求值相等,而不抛出E_NOTICE...

票数 2
EN

Stack Overflow用户

发布于 2017-09-15 19:07:32

代码语言:javascript
复制
class a
{
    public $a = 'aaa';
}

$a = new a();

echo $a->a;  // Writes 'aaa'
echo $a->b;  // Notice: Undefined property: a::$b

echo $a->a ?? '$a->a does not exists';  // Writes 'aaa'

// Does not throw an error although $a->b does not exist.
echo $a->b ?? '$a->b does not exist.';  // Writes $a->b does not exist.

// Does not throw an error although $a->b and also $a->b->c does not exist.
echo $a->b->c ?? '$a->b->c does not exist.';  // Writes $a->b->c does not exist.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34571330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档