目前这是不可能的,虽然提到了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
}
第三个和第四个选项只有在预期返回null并且频繁出现的情况下才值得考虑,因为异常的开销是一个因素。
可能你会发现这种情况并不经常出现,使用异常是更好的选择。
false
?简单的数据类型,清楚地表明初始化对象失败。 - online ThomasgetMyObject
返回实际对象。看起来你的对象可能处于无效状态,这是次优的。但是如果不了解你的代码,很难猜测。 - PeeHaavoid
返回类型与此情况无关。 - AndreaError
异常。除非你有一些非常特殊的情况,否则你的应用程序应该只在一个地方捕获这些异常: 顶级异常处理程序。我认为你在这里寻找的是简单地省略类型注释。这仍然被允许。如果你的返回值是“对象或 null”,那么这就是你应该做的(直到我们引入可空类型)。 - NikiCTypeError
异常:https://gist.github.com/ggirtsou/ee09a5a053e0d17e8caa。```catch Exception```只在PHP 5.x中执行,在PHP 7中将不会被执行。 - ggirtsou