这里有一个 PHP 中的双问号 (??) 运算符,它是什么意思?[重复]
这里有一个 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';
有人对这个主题有什么精确的了解吗?
$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
这是在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有一点区别:对于??
,第一个表达式只计算一次,而? :
则在条件部分首先计算表达式,然后在“答案”部分计算第二次。