有人能解释一下PHP中ternary operator shorthand (?:
)和null coalescing operator (??
)的区别吗?
什么时候它们的行为是不同的,什么时候是相同的(如果真的发生了)?
$a ?: $b
VS.
$a ?? $b
发布于 2016-05-24 01:17:56
当涉及到动态数据处理时,它们的行为是不同的。
如果变量为空( '‘),则null合并将把该变量视为true,但速记三元运算符不会。
$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';
和输出:
1b
2b
2d
1f
Notice: Undefined variable: e in /in/ZBAa1 on line 21
2f
发布于 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时使用??
运算符的区别:
$false = null;
$var = $false ?? "true";
echo $var . "---<br>";//returns: true---
$false = false;
$var = $false ?? "true";
echo $var . "---<br>"; //returns: ---
但是,通过详细介绍三元运算符,我们可以使false或空字符串"“的行为如同它是null一样,而不会抛出e_notice:
$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...
发布于 2017-09-15 19:07:32
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.
https://stackoverflow.com/questions/34571330
复制相似问题