双问号 (??) 运算符在 PHP 中的含义是什么

2022-08-30 05:54:16

我正在深入研究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';

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


答案 1

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


答案 2
$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

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

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

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

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

推荐