双问号(??)运算符在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';

有人对这个话题有把握吗?

这是"零合并运算符";,在php7.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-功能.空销售-op

和原始RFChttps://wiki.php.net/rfc/isset_ternary


编辑:因为这个答案得到了很多视图,所以很少澄清:

1有一个区别:在??的情况下,第一个表达式只被求值一次,而? :是在条件部分中首先求值表达式,然后在"条件"部分中第二次求值;回答";部分

$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
$x = $y ?? 'dev'

如果设置了y,则x=y为短手,否则x="dev">

还有

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

意味着如果y等于"SOMETHING",则x=10,否则x=20

相关内容

  • 没有找到相关文章

最新更新