双问号(??运算符)在PHP中意味着什么

elk*_*tfi 129 php operator-keyword

我正在深入研究Symfony framwork(版本4)代码并发现代码的和平:

$env = $_SERVER['APP_ENV'] ?? 'dev';
Run Code Online (Sandbox Code Playgroud)

我不太确定这实际上是做什么但我想它扩展到类似的东西:

$env = $_SERVER['APP_ENV'] != null ? $_SERVER['APP_ENV'] : 'dev';
Run Code Online (Sandbox Code Playgroud)

或者可能:

$env = isset($_SERVER['APP_ENV']) ? $_SERVER['APP_ENV'] : 'dev';
Run Code Online (Sandbox Code Playgroud)

有人对这个问题有任何精确性吗?

编辑:

对于回答问题的所有人:谢谢所有标记我的问题的人都是否定的,因为已经存在类似的问题(PHP三元运算符vs null合并运算符):

确实,这两个问题非常相似.然而,每个人都很难想象"??" 被称为合并运算符.

否则我可以在官方文档上轻松找到它:

http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

但是,对于那些不知道在php 7中添加了此功能的人来说,更有可能输入:

"php ?? operator"或"php double question mark operator"

这就是为什么我的问题具有附加价值的原因.

我请你,重新考虑你的负面反馈.谢谢

此致,Epixilog

mic*_*sna 137

它是"null合并运算符",在php 7.0中添加.它的工作原理定义如下:

它返回第一个操作数(如果存在且不为NULL); 否则返回第二个操作数.

所以它实际上只是isset()一个方便的运营商.

这两个是等价的:

$foo = $bar ?? 'something';
$foo = isset($bar) ? $bar : 'something';
Run Code Online (Sandbox Code Playgroud)

文档:http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.coalesce

在新的PHP7功能列表中:http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

和原始的RFC https://wiki.php.net/rfc/isset_ternary

  • +1 为文档链接。我时不时地会出现在这里,因为必须拼写出运算符才能让 Google 将其视为搜索词,但我真正想要的只是阅读文档;) (3认同)
  • 最后的编辑不是很清楚/简洁。我很难阅读和理解它。找到了这个,它清除了你想说的内容。所以请添加一个例子。https://www.php.net/manual/en/language.operators.logic.php#115208 $a = (fruit(1) ?fruit(1) : 'apple');//fruit() 将被调用两次! (2认同)
  • 编辑确实没有必要并且令人困惑。`a??b`、`a?:b` 和 `a?a:b` 的语法都足够清晰,只有最后一个有重复的计算 (2认同)

Pro*_*gle 13

$x = $y ?? 'dev'
Run Code Online (Sandbox Code Playgroud)

如果设置了 y,则是 x = y 的简写,否则 x = 'dev'

还有

$x = $y =="SOMETHING" ? 10 : 20
Run Code Online (Sandbox Code Playgroud)

意思是如果 y 等于 'SOMETHING' 那么 x = 10,否则 x = 20


Cid*_*Cid 12

$myVar = $someVar ?? 42;
Run Code Online (Sandbox Code Playgroud)

相当于:

$myVar = isset($someVar) ? $someVar : 42;
Run Code Online (Sandbox Code Playgroud)