PHP中的双问号(??)运算符是什么意思

新手上路,请多包涵

我正在深入研究 Symfony 框架(第 4 版)代码并发现了这段代码:

 $env = $_SERVER['APP_ENV'] ?? 'dev';

我不确定这实际上是做什么的,但我想它会扩展为:

 $env = $_SERVER['APP_ENV'] != null ? $_SERVER['APP_ENV'] : 'dev';

或者可能:

 $env = isset($_SERVER['APP_ENV']) ? $_SERVER['APP_ENV'] : 'dev';

有人对这个主题有任何精确度吗?

原文由 elkolotfi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

它是 php 7.0 中添加的“空合并运算符”。它如何工作的定义是:

如果存在且不为 NULL,则返回其第一个操作数;否则返回第二个操作数。

所以它实际上只是 isset() 在一个方便的运算符中。

这两个是等价的1 :

 $foo = $bar ?? 'something';
$foo = isset($bar) ? $bar : 'something';

文档: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有区别:在 ?? 的情况下,第一个表达式只计算一次,而不是 ? : ,其中表达式首先在条件部分计算,然后是第二个时间在“答案”部分。

原文由 michalhosna 发布,翻译遵循 CC BY-SA 4.0 许可协议

$myVar = $someVar ?? 42;

相当于:

 $myVar = isset($someVar) ? $someVar : 42;


对于常量,使用已经 存在 的常量时的行为是相同的:

 define("FOO", "bar");
define("BAR", null);

$MyVar = FOO ?? "42";
$MyVar2 = BAR ?? "42";

echo $MyVar . PHP_EOL;  // bar
echo $MyVar2 . PHP_EOL; // 42

但是,对于不存在的常量,这是不同的:

 $MyVar3 = IDONTEXIST ?? "42"; // Raises a warning
echo $MyVar3 . PHP_EOL;       // IDONTEXIST

警告:使用未定义的常量 IDONTEXIST - 假定为“IDONTEXIST”(这将在 PHP 的未来版本中引发错误)

Php 会将不存在的常量转换为字符串。

您可以使用 constant("ConstantName") 返回常量的值,如果常量不存在则返回 null,但仍会引发警告。您可以在函数前面加上 错误控制运算符 @ 以忽略警告消息:

 $myVar = @constant("IDONTEXIST") ?? "42"; // No warning displayed anymore
echo $myVar . PHP_EOL; // 42

原文由 Cid 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题