如果遇到空值,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
我想做 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