【问题标题】:Check method in method exists or is not null [duplicate]检查方法中的方法是否存在或不为空[重复]
【发布时间】:2021-06-16 16:23:32
【问题描述】:

有没有更好的方法以更少的代码行检查所有这些?

        if (
            $item->getProduct() !== null
            && $item->getProduct()->getMedia() !== null
            && $item->getProduct()->getMedia()->count()
            && $item->getProduct()->getMedia()->first() !== null
            && $item->getProduct()->getMedia()->first()->getMedia()
        ) {
            $imageUrl = $item->getProduct()->getMedia()->first()->getMedia()->getUrl();

【问题讨论】:

  • 您可以使用Null Object Pattern
  • 哇!这些是很好的答案/ cmets!谢谢@markus-zeller 和 imsop!
  • @IMSoP 我想你可以发布答案。虽然 php8 并非无处不在,但它是我问题的最巧妙的解决方案。 (我知道我用 php7 标记了问题)

标签: php php-7


【解决方案1】:

在 PHP 8.0 中,有一个新的“nullsafe 运算符”,拼写为 ?-> 正是为了这个目的:它仅在值不为 null 时调用该方法。

如果不能做的唯一部分是对->count() 进行额外检查,但只要->first() 在空集上返回 null 而不是错误,这将起作用:

$imageUrl = $item?->getProduct()?->getMedia()?->first()?->getMedia()?->getUrl();

除非并且直到您可以升级到 PHP 8,否则您最好的选择是寻找改进 API 的方法来避免这个问题。根据Law of Demeter,您可以定义其他方法,以便您可以编写以下代码:

$imageUrl = $item->hasProductMedia() ? $item->getProductMedia()->first()->getUrl() : null;

hasProductMedia()getProductMedia() 的实现仍然需要这些检查,但它们被隐藏起来,而不是在每次需要访问时都写入。

另一种方法是“空对象模式”(Markus Zeller 在 cmets 中提到这一点)。每个方法都返回一个满足正确接口的特殊“空对象”,而不是返回 null。

所以$item->getProduct() 永远不会返回null,但可能会返回NullProduct;对此调用getMedia(),或任何没有任何媒体的产品,将返回EmptyMediaList;等等。最后,你会在NullMediaItem 上调用getUrl(),它会给你一个空值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2013-11-16
    • 2011-12-28
    相关资源
    最近更新 更多