如果遇到空值,php 是否有办法停止调用链?

Does php have a way to stop the call chain if a null value is encoutered?

我想做 self::container()->get($path);self::container() 可以 return null.

在链接函数调用时是否有更快的方法来避免 Call to a member function get() on null 错误,有些方法可以 return null 而不是对象?

有没有比嘲笑预期 object/member 的丑陋解决方法更好的方法?

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

我追求的是 C#

中的 null-conditional member access operator (?.)

This answer applies for PHP versions olders than 8.0.0. For PHP 8.0.0 and later see Maks3w answer

简短回答:不,PHP中没有这样的东西。

我会不惜一切代价避免像你建议的那样施展魔法。

正在做:

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

会更容易 read/understand。

现在,关于 null,它已由其创建者 (Tony Hoare) 描述 "The Billion Dollar Mistake"

更好的方法是 self::container() 将具有 return 类型 ContainerInterface 而没有成为 null 的可能性。尝试 return 一个 null,它会抛出一个 TypeError,这可能会被捕获。这样,对 ->get() 的调用将永远不会发生,因为之前会抛出异常。

允许 self::container() 到 return 类似 ContainerInterface|null 的东西会导致 所有调用者 实现你提出的逻辑也会导致(很多)重复代码。

出于同样的原因,为您的依赖项指定一个特定的 return 类型可能会更安全:

<?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() 上已经遇到的相同问题。

在即将到来的 PHP 8 中,nullsafe_operator 将被实施,如果其中一个返回 null,将允许中断一连串的调用

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