目前这是不可能的,尽管如前所述,有一些 RFC 可能会解决未来版本的问题。
到目前为止,您的选择是:
1.从您的方法签名中删除返回类型:
public function getMyObject()
{
return null;
}
2.抛出并捕获异常(根据@NiettheDarkAbsol 的回答):
public function getMyObject() : MyObject
{
throw new MyCustomException("Cannot get my object");
}
3.重构为两种方法:
private $myObject;
//TODO think of a better method name
public function canGetMyObject() : bool
{
$this->myObject = new myObject();
return true;
}
public function getMyObject() : MyObject
{
if(!$this->myObject){
throw new MyCustomException("Cannot get my object");
}
return $this->myObject;
}
调用代码:
if($cls->canGetMyObject()){
$myObject = $cls->getMyObject();
}
4.使用bool返回类型和out参数:
public function tryGetMyObject(&$out) : bool
{
$out = new myObject();
return true;
}
调用代码:
$myObject = null;
if($cls->tryGetMyObject($myObject)){
$myObject->someMethod(); //$myObject is an instance of MyObject class
}
第 3 和第 4 选项仅在预期返回 null 且频繁出现的情况下才真正值得考虑,因此异常的开销是一个因素。可能你会发现这实际上并不经常适用,例外是前进的方向