这里有一个 PHP 中的双问号 (??) 运算符,它是什么意思?[重复]

26 浏览
0 Comments

这里有一个 PHP 中的双问号 (??) 运算符,它是什么意思?[重复]

这个问题在这里已经有答案
PHP short-ternary ("Elvis") operator vs null coalescing operator

社区曾经审查过是否重新开放这个问题 4个月之前 并且决定维持关闭状态:

原始关闭理由未解决

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

有人对这个主题有什么精确的了解吗?

admin 更改状态以发布 2023年5月23日
0
0 Comments

$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

0
0 Comments

这是在PHP 7.0中加入的“null 合并运算符”。它的工作原理定义如下:

如果其第一个操作数存在且不为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有一点区别:对于??,第一个表达式只计算一次,而? :则在条件部分首先计算表达式,然后在“答案”部分计算第二次。

0