嵌套 null 合并运算符 (??) 在 PHP 中如何工作?需要执行流程的分步说明

How does nesting null coalescing operator(??) work in PHP? Need step-by-step explanation of execution flow

我正在使用 PHP 7.2.0

我已经了解 空合并运算符(??) 的正常基本用法,但我无法理解空合并运算符 ( ??) 是嵌套的。

请考虑下面的代码示例并逐步向我解释执行流程。

<?php

$foo = null;
$bar = null;
$baz = 1;
$qux = 2;

echo $foo ?? $bar ?? $baz ?? $qux; // outputs 1

?>

如果您在空合并运算符的单个步骤周围添加括号,我认为您的示例会变得更清晰。

echo ($foo ?? ($bar ?? ($baz ?? $qux)));

基本上和从左到右执行是一样的

空合并运算符是右结合运算符。这意味着操作是从右到左分组的。即,表达式 a ?? b ?? c 被评估为 a ?? (b ?? c).

它的工作方式与其基本用法类似。

执行流程如下:

  1. 它检查 isset($foo) 它没有被设置,它包含 NULL 所以,去 $bar
  2. 它检查 isset($bar) 它没有被设置,它太包含 NULL 所以,去 $baz
  3. 它检查 isset($baz) 它已被设置,它包含值 1 因此,它被打印并停止执行。

您可以在一系列 if/elseif/else 语句中翻译空合并运算符。来自你的例子:

echo $foo ?? $bar ?? $baz ?? $qux; // outputs 1

翻译成 if/else 语句:

<?php
$foo = null;
$bar = null;
$baz = 1;
$qux = 2;

if (isset($foo)) {
   echo $foo;
}
else if (isset($bar)) {
   echo $bar;
}
else if (isset($baz)) {
   echo $baz;
} 
else { 
    echo $qux;
}

我个人非常谨慎地使用 null 合并运算符,嵌套它似乎是灾难的根源。

空合并运算符(除了有一个非常烦人的名字之外)并没有提高代码的可读性。我认为省去的几行代码不值得在阅读代码时花费额外的精力。或者让其他人遇到麻烦 reading/comprehend 您的代码是值得的。因此,对您的程序员同事来说,做一个好的程序员并谨慎使用 null 合并运算符并且从不 嵌套它。