在 PHP 中使用带有常量的空合并运算符是否有一个奇特而简短的解决方案?

Is there a fancy and short solution for using the null coalescing operator with constants in PHP?

由于 PHP 8 constant() 函数抛出错误而不是返回 null 并在未定义给定常量时生成 E_WARNING,因此我不能'不再使用以下代码设置变量

$foo = $SESSION['bar'] ?? constant("MY_CONSTANT") ?? "baz";

我明显的快速解决方案是将该行更改为:

$foo = $SESSION['bar'] ?? (defined("MY_CONSTANT") ? constant("MY_CONSTANT") : "baz");

老实说,这让我有点困扰,因为我喜欢第一个代码更清晰,并且不强迫我写 带有十亿个括号的丑陋的巨型三元序列 以防我想向 ?? 级联添加更多常量。我也尝试过 - 绝望,因为围绕 null coalescing operator 的(简短)文档已经说明 ?? 只是三元中 isset() 的快捷方式 - 以下内容:

$foo = $SESSION['bar'] ?? MY_CONSTANT ?? "baz";

但它没有奏效 - 正如预期的那样。另一种解决方案是在未定义常量时创建一个 returns null 的函数,例如:

function defined_constant($constant) {

    return (defined($constant) ? constant($constant) : null);

}

$foo = $SESSION['bar'] ?? defined_constant("MY_CONSTANT") ?? "baz";

我想知道是否有任何解决方案无需创建新函数或更改 php.ini 文件 允许我仅使用 ?? 作为在第一行代码中。

如果我的问题的答案只是“不,没有解决方案”也没关系,但我很好奇,我在互联网上找不到太多关于这个的东西。 PHP 似乎也只有一些围绕常量的本机函数(三个 miscellaneous functionsget_defined_constants()?)。

真正的方法是检测所有未定义的常量并定义:defined('MY_CONSTANT') || define('MY_CONSTANT', 'baz');

如果你想拯救这个垃圾建筑,那么你可以使用这样的东西get_defined_constants()['MY_CONSTANT'] ?? 'baz'