PHP中的C#的空合并运算符(??)

dpp*_*dpp 49 php ternary-operator null-coalescing-operator php-7

在PHP中是否有像??C#一样的三元运算符?

?? 在C#中是干净和短,但在PHP中,你必须做的事情如下:

// This is absolutely okay except that $_REQUEST['test'] is kind of redundant.
echo isset($_REQUEST['test'])? $_REQUEST['test'] : 'hi';

// This is perfect! Shorter and cleaner, but only in this situation.
echo null? : 'replacement if empty';

// This line gives error when $_REQUEST['test'] is NOT set.
echo $_REQUEST['test']?: 'hi';
Run Code Online (Sandbox Code Playgroud)

zer*_*kms 63

PHP 7添加了null coalesce运算符:

// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
Run Code Online (Sandbox Code Playgroud)

您还可以看一下编写php的三元运算符的简短方法吗?:( php> = 5.3 only)

// Example usage for: Short Ternary Operator
$action = $_POST['action'] ?: 'default';

// The above is identical to
$action = $_POST['action'] ? $_POST['action'] : 'default';
Run Code Online (Sandbox Code Playgroud)

你与C#的比较是不公平的."在PHP中你必须做类似的事情" - 在C#中,如果你试图访问一个不存在的数组/字典项,你也会遇到运行时错误.

  • 真?那么,如果我正在访问一个不存在的数组元素?我也会得到错误,是的,这是有道理的. (6认同)

koj*_*iro 51

空联合运营商,( ??)已接受并执行PHP 7.它与短三元运算符(?:)的不同之处在于??它将抑制E_NOTICE在尝试访问没有键的数组时发生的情况.RFC中的第一个示例给出:

$username = $_GET['user'] ?? 'nobody';
// equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
Run Code Online (Sandbox Code Playgroud)

请注意,??操作员不需要手动应用isset来防止E_NOTICE.

  • 它实际上可以在`isset()`的任何地方工作,所以它也适用于变量和属性. (2认同)
  • 另外,一个很好的功能是你可以链接它,因此:`$ _GET ['user'] ?? $ _SESSION ['user'] ?? 'bob';` - 当它短路时,你甚至可以进行函数调用.另外,与`isset($ foo)不同?$ foo:$ bar`,如果它是一个函数调用(例如`foo()[0]`),它将不会对它进行两次计算.:) (2认同)

Luk*_*Led 10

我用的是功能.显然它不是运营商,但似乎比你的方法更清洁:

function isset_or(&$check, $alternate = NULL)
{
    return (isset($check)) ? $check : $alternate;
}
Run Code Online (Sandbox Code Playgroud)

用法:

isset_or($_REQUEST['test'],'hi');
Run Code Online (Sandbox Code Playgroud)

  • @ AxelA.Grazx:我作为参考传递,因为如果它不作为参考发送,`$ _REQUEST ['test']`值将在函数调用之前计算,然后传递给函数.如果`$ REQUEST`数组没有这个元素,它将抛出`Undefined index:test`错误.我想避免这种情况. (4认同)
  • 这具有将检查键设置为null的负面影响:http://3v4l.org/9vmFR这是一个特别成问题的案例:http://3v4l.org/sMsKD (2认同)

dec*_*eze 6

在PHP 7之前,没有.如果需要涉及isset,使用的模式是isset($var) ? $var : null.没有?:包含其特征的运营商isset.

  • 这基本上使它在大多数情况下无用.:/ (4认同)
  • 我仍然发现了很多用例; 它基本上是PHP相当于Javascript的`||'运算符,非常方便.:) (4认同)