php5中返回类型一致性


return type consistency in php5

我见过很多关于PHP函数失败时返回内容的线程。但它们都是关于PHP4的。

现在,在我最近的(PHP5)项目中,我想强制实现某种与返回类型的一致性(我甚至不知道这是否值得)。因此,如果一个方法的正常返回类型是数组,那么在该方法失败的情况下,我应该返回什么?

  • null
  • 空数组()
  • 而是引发异常

在C#中,我会返回null,所以我是否应该在编写PHP时不断思考在强类型语言中该怎么做?或者在这个特定的场景中有什么更合理的东西吗?每种选择的优缺点是什么?

如果在执行方法的逻辑时没有错误(在这种情况下,我建议抛出异常),我会说返回一个空数组。这将使这样的情况更容易处理:

foreach($obj->method() as $item)
{
    // ...
}

如果YourClass::method()返回null,我将得到一个"提供的参数无效"警告,而返回一个空数组将永远不会触发该警告。

无论你最终选择什么,都要坚持下去。没有人喜欢使用返回值不一致且没有逻辑意义的API。

对于不可恢复的错误,我会抛出异常。

例如,假设您有一个类似getById($id)的方法。如果找不到任何内容,可以返回null。现在假设您有另一个方法,delete($id),它本身将调用getById($id)。在这种情况下,如果什么都没有找到(即:getById返回null),则应该抛出异常。

请记住,每当您报告返回值为null、空数组或字符串,甚至是整数的错误时,您都需要处理此错误,可能会根据返回值在其他地方进行一些清理。这可能会导致所涉及的所有方法/函数中出现一些脏东西。

使用异常将允许您仅在一个位置(在捕获处)处理和捕获这些错误。因此,您不必复制检查错误的代码(返回值是空数组吗?返回值是1、2还是9?等等)。除此之外,使用异常可以让您轻松地"编目"错误类型(如业务逻辑异常或无效参数),而无需在源代码中编写大量if。

因此,如果函数/方法返回一些东西(即:它正常终止),则返回值是您可以使用的东西(空数组、null或空字符串都是有效的返回值)。如果一个函数/方法抛出异常,那么显然出了问题。

另一件重要的事情是,如果你不使用严格的检查(==vs.==),null可以等于false、0和空字符串,所以这可能会导致其他类型的错误。这也是例外情况的优势所在。

当然,无论你做什么决定,重要的是在代码中与你的选择保持一致。

如果一个函数真的"失败"了,那么我会选择一个异常。异常表示故障。

不过,在某个时刻,您需要决定如何处理异常,然后您可能会决定返回一个空数组可能是最好的。例如,如果您希望保持现有的foreach()循环正常工作,那么这将非常有用。

因此,使用异常,但要考虑在哪里捕获它们,并将它们处理为对用户有用的东西。

如果方法失败,则应将其归类为异常IMO,这将使您能够正确地捕捉预期并采取行动。

我坚信函数和方法的响应应规范化。当你知道函数将返回什么时,它会让生活变得更轻松。

简而言之,如果抛出失败,如果不确保返回数组则返回异常,则我的$0.02