【问题标题】:Laravel 5.2 - PHP 7.0.6 coalesce operators returning empty stringsLaravel 5.2 - PHP 7.0.6 合并运算符返回空字符串
【发布时间】:2016-09-05 20:40:03
【问题描述】:

所以我有一个依赖 Laravel 5.2 / PHP 7.0.6 的项目,它使用 Transformers 来处理 API 响应。在我们代码的许多地方,我们使用新的 php 7 合并 (??) 运算符。但是,自从我们更新到 php 7.0.6 后,我们看到了很多以下内容:

代码:'vip_id' => $beneficiaryQdro->beneficiary->vip_id ?? ''

预期结果:11583(受益人关系的vip id)

实际结果:''

我试过运行这个:dd($beneficiaryQdro->beneficiary->vip_id),我得到了正确的 vip_id 返回。但是,当我添加合并运算符时,它再次返回一个空字符串。这以前工作过。其他人看到新的 php 版本会发生这种情况吗?

更新:我已经通过预先加载关系修复了它。 Coalesce 运算符不喜欢处理动态填写信息的关系。我不确定这会成为谁的问题。在 7.0.6 之前,合并操作符处理的关系不是急切加载就好了,但是这个更新以某种方式破坏了它。

【问题讨论】:

  • 实际上我不知道问题是什么,但我是如何通过急切加载关系来解决的。 Coalesce 运算符不喜欢处理动态填写信息的关系。使用基本的 php 对象不可能复制这个问题。
  • 你可以尝试先设置一个变量,比如$vip_id =$beneficiaryQdro->beneficiary->vip_id
  • 我宁愿急切加载或延迟急切加载。我已经修好了。但是,我很好奇为什么现在才发生这种情况。 7.0.5 没有这个问题。我不介意在 PHP 或 Laravel 上添加一个错误,但老实说我不确定谁需要处理这个
  • 我建议向他们俩报告。他们可能都需要意识到这一点。

标签: php laravel null-coalescing-operator


【解决方案1】:

在做:

$beneficiaryQdro->beneficiary->vip_id ?? ''

和做的一样:

isset($beneficiaryQdro->beneficiary->vip_id) ? $beneficiaryQdro->beneficiary->vip_id : ''

因此,除非加载了 beneficiary 关系,否则在执行 isset 时将始终为 false 并导致为 ''。

在 PHP 7.0.6 中修复了 2 个错误,它们看起来与您的行为和遇到的问题有关:

使用重写的 __get() 方法在类上合并运算符

https://bugs.php.net/bug.php?id=71359

Null 合并运算符和 ArrayAccess

https://bugs.php.net/bug.php?id=71731

因此,Eloquent 如何使用其神奇的方法处理它可能是个问题。不过,我没有安装 PHP 7 来确认这一点。

看起来这里也有人问过这个问题:https://laracasts.com/discuss/channels/eloquent/eloquent-relation-isset-always-return-false

看起来它不应该在 7.0.6 之前工作。

总而言之,isset 不会加载关系。

【讨论】:

  • 我不同意这种情况总是如此,因为在这个版本之前从未如此
  • 我的意思是根据我对合并运算符的理解,它应该始终是错误的。
  • 不是真的。 Laravel 关系在调用时动态加载,并且使用 coalesce 运算符让它们运行然后检查响应(正确的操作顺序),但现在它只是立即检查它而不等待,这导致它总是返回默认值
  • 为您做了更多研究。更新了我的答案。
猜你喜欢
  • 2019-03-18
  • 2011-06-19
  • 1970-01-01
  • 2013-06-16
  • 2015-04-04
  • 2017-01-22
  • 2019-03-27
  • 2012-05-07
  • 1970-01-01
相关资源
最近更新 更多