php有办法在遇到空值时停止调用链吗?[duplicate]

7qhs6swi  于 2023-01-29  发布在  PHP
关注(0)|答案(2)|浏览(122)
    • 此问题在此处已有答案**:

Is there a "nullsafe operator" in PHP?(3个答案)
两年前关闭了。
我想执行self::container()->get($path);,但是self::container()可以返回null
在链接函数调用时,有没有更快的方法来避免Call to a member function get() on null错误,有些函数调用可能返回null而不是对象?
有没有比嘲笑预期对象/成员这一丑陋的变通方法更好的方法?

public static function getDependency($path) {
 return self::container() ??
  (new class{public function get($path){return null;}})->get($path);
}

我所追求的是类似于C#中的空条件成员访问运算符(?.)的东西

7cwmlq89

7cwmlq891#

在即将到来的PHP8中,将实现nullsafe_operator,并且如果其中一个调用返回null,则允许对调用链进行断路

$result = $o->returnNull()?->doSomething()
   $results === null // True
koaltpgm

koaltpgm2#

从PHP 8.0开始,您可以使用Nullsafe方法和属性来执行以下操作:
self::容器()?-〉get($路径);
否则,您将得到下面的原始答案,因为它针对PHP 7.3:
简短回答:不,PHP 7.3中没有这样的东西。
我会避免像你建议的那样施魔法。
执行:

<?php
public static function getDependency($path) {
    $container = self::container();
    if ($container instanceof ContainerInterface) {
        return $container->get($path);
    }
}

会更容易阅读/理解。
现在,关于null,它已经被它自己的创造者(Tony Hoare)"The Billion Dollar Mistake"描述过了。
一个更好的方法是self::container()的返回类型为ContainerInterface,而不可能是null。尝试返回null时,它将抛出TypeError,这可能会被捕获。这样,对->get()的调用将永远不会发生,因为以前会抛出异常。
允许self::container()返回类似ContainerInterface|null的内容将导致所有调用者实现您所建议的逻辑,这也将导致(大量)重复代码。
出于同样的原因,为依赖项指定一个特定的返回类型可能会更安全:

<?php
public static function getServiceFoo($path): ServicFoo {
    $container = self::container();
    if (!$container instanceof ContainerInterface) {
        throw new RuntimeException("Not a valid container received");
    }

    return $container->get($path);
}

否则,您将在getServiceFoo()上遇到与self::container()相同的问题。

相关问题