当前位置: 首页 > 知识库问答 >
问题:

什么是双问号(??)PHP中的运算符平均值[重复]

龙昊焱
2023-03-14

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

有人对这个题目有什么精确的说法吗?

共有3个答案

米子轩
2023-03-14
$x = $y ?? 'dev'

如果设置了 y,则为 x = y 的简写,否则 x = 'dev'

还有

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

意思是如果y等于“某物”,则x=10,否则x=20

冷英光
2023-03-14
$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将把不存在的常量转换为字符串。

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

$myVar = @constant("IDONTEXIST") ?? "42"; // No warning displayed anymore
echo $myVar . PHP_EOL; // 42
戚奇略
2023-03-14

这是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-calence-op

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

编辑:由于这个答案得到了很多意见,所以很少有澄清:

1有区别:在的情况下,第一个表达式只求值一次,而不是?:,其中表达式首先在条件部分求值,然后第二次在“答案”部分求值。

 类似资料:
  • 本文向大家介绍双问号(??)运算符在PHP中是什么意思?,包括了双问号(??)运算符在PHP中是什么意思?的使用技巧和注意事项,需要的朋友参考一下 PHP 7添加了新的运算符双问号(??)运算符。在PHP 7中,双问号(??)运算符称为Null合并运算符。 如果它存在且不为NULL,则返回其第一个操作数;否则返回第一个操作数。否则,返回其第二个操作数。从左到右评估。Null合并运算符也可以链形式使

  • 问题内容: 我在一些代码中看到了这一点,但我不知道它的作用: 什么是运营商做? 问题答案: 那是一个双重的非按位运算符。用作的更快替代品

  • 关于使用问号的两个问题"?"和冒号":"打印函数括号内的运算符:它们是做什么的?还有,有人知道它们的标准术语吗?或者我在哪里可以找到更多关于它们使用的信息?我读过它们类似于“if”“其他”语句。

  • 问题内容: 关于使用问号“?”的两个问题 在打印功能的括号内加上冒号“:”运算符:它们是做什么的?另外,有人知道它们的标准术语吗,或者在哪里可以找到有关它们使用的更多信息?我读过它们类似于’if’‘else’语句。 问题答案: 这是三元条件运算符,可以在任何地方使用,而不仅仅是print语句。它有时被称为“三元运算符”,但它不是唯一的三元运算符,而是最常见的一个。 这是Wikipedia的一个很好

  • 问题内容: 将在今年11月发布的PHP 7将引入Spaceship(<=>)运算符。它是什么以及它如何工作? 问题答案: 该(“飞船”),运营商将提供,它会合并比较: 组合比较运算符使用的规则与PHP viz当前使用的比较运算符相同。,,,和。那些来自Perl或Ruby编程背景的人可能已经熟悉为PHP7建议的这个新运算符。

  • 本文向大家介绍JavaScript中的赋值运算符是什么?,包括了JavaScript中的赋值运算符是什么?的使用技巧和注意事项,需要的朋友参考一下 使用赋值运算符,您可以将值分配给变量。JavaScript支持以下赋值运算符- 序号 运算符和说明 1 =(简单分配) 从右侧操作数到左侧操作数分配值 例如: C = A + B将A + B的值分配给C 2 + =(添加和分配) 将右操作数添加到左操作