在 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 functions 和 get_defined_constants()
?)。
真正的方法是检测所有未定义的常量并定义:defined('MY_CONSTANT') || define('MY_CONSTANT', 'baz');
等
如果你想拯救这个垃圾建筑,那么你可以使用这样的东西get_defined_constants()['MY_CONSTANT'] ?? 'baz'
由于 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 functions 和 get_defined_constants()
?)。
真正的方法是检测所有未定义的常量并定义:defined('MY_CONSTANT') || define('MY_CONSTANT', 'baz');
等
如果你想拯救这个垃圾建筑,那么你可以使用这样的东西get_defined_constants()['MY_CONSTANT'] ?? 'baz'