双重问号(??)运算符在PHP中的含义[重复]

问题描述 投票:59回答:3

这个问题在这里已有答案:

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

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

编辑:

致所有回答问题的人:谢谢所有将我的问题标记为否定的人,因为已经有类似的问题(PHP ternary operator vs null coalescing operator):

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

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

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

php operator-keyword symfony4
3个回答
74
投票

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

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

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

这两个是等价的:

$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


8
投票
$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,但它仍会引发警告。您可以使用error control operator @添加该函数以忽略警告消息:

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

1
投票
$x = $y ?? 'dev'

如果设置了y,则x = y是短手,否则x ='dev'

还有

$x = $y =="SOMETHING" ? 10 : 20

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

© www.soinside.com 2019 - 2024. All rights reserved.