$_SERVER['MODE']设置为not时,以下代码可以理解地生成"dev":

$_SERVER['MODE'] ?? null === 'production' ? 'prod' : 'dev'

这是因为$_SERVER['MODE'] ?? null解析为NULL,当然,这并不严格地等于"产生",所以三元表达式的right操作数占优势.

然而,如果我将$_SERVER['MODE']设置为any的真实值,事情就变得奇怪了.代码会产生"prod"!

我不明白为什么.当设置为$_SERVER['MODE']时,空值合并将解析为其设置的任何值.因此,除非将其设置为"Products",否则三元表达式的right操作数仍应优先.为什么不是呢?

此外,如果我添加这样的括号:

($_SERVER['MODE'] ?? null) === 'production' ? 'prod' : 'dev'

-然后它就会像预期的那样工作.但为什么不能go 掉括号呢?

相关但不是被复制:PHP null coalesce + ternary operators strange behavior

另外,这种困惑让我损失了40美元.$_SERVER['MODE']设置为"dev",但随着表达式解析为"prod",实际的AWS实例被启动:D.

推荐答案

通过将$_SERVER['MODE'] ?? null === 'production'分离出来,您可以非常容易地测试它的结果.

var_dump(1 ?? null === 'production'); // 1

var_dump(null ?? null === 'production'); // false

var_dump(null ?? 'production' === 'production'); // true

这意味着,您的操作数按如下方式分组,除非您添加方括号:

( $_SERVER['MODE'] ?? (null === 'production') ) ? 'prod' : 'dev'

如果$_SERVER['MODE']nullfalse以外的任何其他值,则结果运算将为:

$_SERVER['MODE'] ? 'prod' : 'dev'

因此,每一个真实的价值都会被判断为"Prod".

这是因为空合并运算符具有比三元运算符(as can be seen here)更高的优先顺序

我希望这是有道理的.

作为一条建议,在这样的情况下,尽量总是加上括号.代码更易于阅读、维护和调试.没有人会因为这样的问题而发疯或赔钱.

Php相关问答推荐

如何在搜索域名时重定向到登陆页?

管理员订单列表中的自定义列与WooCommerce 8.6.1一起消失

在保留唯一键值对的情况下高效合并嵌套数组

Mysqli_stmt::Execute():结果字段元数据中存在过早的EOF

在WooCommerce产品中按类型对产品属性术语进行分类以供显示

WooCommerce HPOS管理订单列表中带有订单元数据的定制列

当主页和帖子的缩略图相同时,如何减少主页和帖子的缩略图

使注册字段UserMeta值对于WooCommerce中的每个用户是唯一的

PHP -将字符串拆分为两个相等的部分,但第二个字符串中的单词更多

PHP:为什么递归需要这么长时间

无法在Laravel中将日志(log)通道设置为空

Rappasoft Datatables V2(我想在另一个表具有相同值列时显示数据)

允许在WooCommerce管理订单列表中使用计费邮箱进行搜索

如何在 PHP laravel 中将图像的透明背景转换为白色?

为什么 debug_backtrace() 不返回任何内容?

如何在 php 中获取正确的时间

Xdebug 不会在断点处停止

适当的时区处理 Laravel / Carbon

在帖子内容中使用短代码触发 Woocommerce 挂钩

PHP Remedy API 调用以创建附件无效的条目(使用 Postman Works!)