php - 关于 PHP 中的 elvis 运算符的困惑
问题描述
我经常使用 elvis 运算符来设置默认值。例如,我有一个数组$x = ['value' => $value];
,然后在我的代码的另一部分,$val = $x['value'] ?: '22';
在上面的场景中,如果$value
是 3,$val 也应该是 3,但是如果$value
是 undefined 或 0 什么的,它应该是 22。
当我在php playground上运行这种代码时,即使 $x 本身没有被定义,或者$x
没有'value'属性,或者$value
没有定义,它也会输出 22。
但是,当我在我的 Laravel 服务器上运行相同的代码时,行为是不同的。如果$x
已定义,并且$x['value']
被定义为虚假的,那么 evlis 运算符将按预期工作。但是如果$x
没有定义,或者$x['value']
没有设置,我会得到一个错误。例如,如果$x
已定义但$x['value']
未定义,我会收到“未定义索引”错误。以下是一些具体示例,以及两种环境中发生的情况
$x = ['value' => 0];
$val = $x['value'] ?: '22';
// this works on both my laravel server and the playground appropriately
$x = [];
$val = $x['value'] ?: '22';
// on Laravel, this errors, but on the playground it sets val to 22
unset($x);
$val = $x['value'] ?: '22';
// on Laravel, this errors, but on the playground it sets val to 22
所以我对 elvis 运算符以及它如何处理未定义的值和未设置的索引有点困惑。大多数时候,我实际上更希望它以游乐场的行为方式运行——将未定义的值视为“虚假”并默认为运算符的右侧。但我不确定预期的行为到底是什么。
解决方案
推荐阅读
- python - 如何将 asyncio GET 请求实现为自包含类?
- datetime - Azure 数据工厂 - 添加当前时间和随机数
- .net - .NET 5 - 用于上传大文件的 web.config - Azure 应用服务
- asp.net-core - 仅在 IIS 中使用 asp.net 核心未发现局部视图异常
- docker - 如何在我的 docker 映像 apache/airflow:2.1.4 上安装 gecko 驱动程序和 firefox
- c# - 无法从程序集“Volo.Abp.Authorization.Abstractions,Version=4.4.2.0”加载类型“Volo.Abp.Authorization.Permissions.IPermissionStateManager”,
- react-native - watchPosition 的问题反应原生博览会
- java - 如何修复不支持的 major.minor 版本 52.0 异常?
- keras - 如何解决 ValueError: Graph disconnected: cannot get value for tensor Tensor("input_1:0", shape=(?, 784), dtype=float32) at layer "input_1"
- javascript - 如何使用 Javascript 将值从一个 HTML 页面传递到另一个 HTML 页面