正确处理PHP 7返回类型的方法

S.P*_*ols 28 php oop php-7

我正忙着创建一个应用程序,我想使用PHP 7返回类型.现在我在php.net上读到,这是一个设计决定,null在定义返回类型时不允许返回.

处理这个问题的正确方法是什么?

一个选项是try ... catch块:

public function getMyObject() : MyObject
{ 
     return null;
}

try
{
    getMyObject();
}
catch(Exception $e)
{
    //Catch the exception
}
Run Code Online (Sandbox Code Playgroud)

我对此没有很好的感觉,因为我的代码将是一个巨大的尝试... catch块因为我需要为每个返回对象的方法编写一个try ... catch块.

空对象模式是一个很好的解决办法,但我不喜欢这个主意,以创建一个NullObject在我的应用程序的每个对象.有没有正确的方法来做到这一点?

Nie*_*sol 27

如果你的代码希望返回一个类的实例,在这种情况下MyObject,但它没有,那么这确实是一个例外,应该这样处理.

但是,您应该自己抛出此异常.

public function getMyObject() : MyObject
{
    throw new MyCustomException("Cannot get my object");
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以捕获该特定异常并相应地继续.


Fab*_*ler 6

我对此没有很好的感觉,因为我的代码将是一个巨大的try/catch块,因为我需要为每个返回对象的方法编写一个try/catch块.

替代方法(使用您的代码)将始终检查返回的值,null以避免错误null用作对象.

使用异常更具表现力,并且可以及早发现错误,这是一件好事.因此,要么确保您的方法始终返回一个对象,要么在它无法履行合同时抛出异常.否则返回类型没有实际值.

  • 它会让你感觉如何.也许这是避免try/catch块的习惯,但我认为这是接受行为并利用它的好处的好时机. (3认同)

nik*_*206 6

您可以使用Option数据类型.

它是一种具有SomethingNothing作为包裹值的类型.

你可以找到更详尽的描述在这里和PHP的开放实现一个在这里

PS请不要为这种逻辑使用异常,输出参数或其他方法,这对于工作来说是错误的工具.