【问题标题】:How to safely chain methods? [duplicate]如何安全地链接方法? [复制]
【发布时间】:2015-09-19 07:28:38
【问题描述】:

如果之前的某个方法返回null,有没有办法“安全地”链接PHP 中的方法并简单地返回null?否则会抛出错误:trying to get property on non-object;

例如,以下代码使用 QuickBooks SDK 检查客户的电话号码是否已更改。我无法控制这些方法。

$customer->getPrimaryPhone() 将始终返回一个对象,否则不会提交表单,但如果之前不存在电话号码,$old->getPrimaryPhone() 可能会返回 null

获取电话号码需要以下内容:

$old->getPrimaryPhone()->getFreeFormNumber()

如果getPrimaryPhone() 返回null,则会抛出错误。

我的问题是:在以下情况下如何避免代码重复?

if (!empty($old->getPrimaryPhone())) {
    if ($customer->getPrimaryPhone()->getFreeFormNumber() !== $old->getPrimaryPhone()->getFreeFormNumber()) {
        // Repetive code here
    }   
} else {
        // Repetive code here
}

【问题讨论】:

  • if ($oldPrimaryPhone = $old->getPrimaryPhone()) ... !== $oldPrimaryPhone->getFreeFormNumber()
  • 即使这些方法具有相同的名称,即使两个对象具有相同的 getFreeFormNumber() 值,有时属性存储在索引 0 处的数组中,有时存储为基元价值。因此,我无法比较更高级别的对象。同样,不在我的控制范围内。
  • 根据实际的链组合,返回 NullObject 有时是有意义的。
  • @mario,没错。我想找到一种方法让 $old->getPrimaryPhone()->getFreeFormNumber() 返回 null 或空对象,而不是抛出错误 trying to get property on non object

标签: php laravel-5


【解决方案1】:

我倾向于在您的 PhoneNumber 类(或其他任何名称)上实现 equals 方法。例如

public function equals(PhoneNumber $otherNumber) {
    return $otherNumber !== null && $this->getFreeFormNumber() === $otherNumber->getFreeFormNumber();
}

那么你可以简单地使用

if (!$customer->getPrimaryPhone()->equals($old->getPrimaryPhone())

如果您有其他需要应用的逻辑(如您对数组的评论中所述),您可以在 equals 方法中轻松实现。

【讨论】:

  • 有趣。我有几个领域有这个问题。我当然可以为每个字段创建一个方法,但是在不知道二级方法名称的情况下,有没有一种通用的方法可以做到这一点?如果是这样,我只能使用一个函数来比较 addressemail 等其他字段。
  • 您可以使用 equals 方法实现所有 field 类,然后只需在父类 equals 方法中调用 return $this->field->equals($other->field) &&..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多