在php5中返回类型一致性

时间:2012-01-17 19:14:29

标签: php strong-typing

在PHP函数失败的情况下,我看到了大量关于返回内容的线程。但他们都是关于PHP 4的。

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

  • 空数组()
  • 抛出异常

在C#中我会返回null,所以我应该不断思考我会用强类型语言做什么吗?或者在这个特定场景中有什么更有意义吗?每种选择的优缺点是什么?

4 个答案:

答案 0 :(得分:3)

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

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

如果YourClass::method()返回null,我会收到“提供无效参数”警告,而返回空数组则永远不会触发。

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

答案 1 :(得分:1)

如果一个函数确实'失败',那么我会去寻找一个例外。例外意味着失败。

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

因此,请使用异常,但要考虑要捕获它们的位置并将其处理为对用户有用的内容。

答案 2 :(得分:1)

如果该方法失败,则应将其归类为异常IMO,这将允许您正确捕获预期的期望并对其采取行动。

我坚信正常化功能和方法的反应。当你知道函数将返回什么时,它会让生活变得更加轻松。

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

答案 3 :(得分:1)

我会在不可恢复的错误上抛出异常。

例如,假设您有一个像getById($ id)这样的方法。如果没有找到,则可以返回null。现在让我们说你有另一个方法,删除($ id),它本身会调用getById($ id)。在这种情况下,如果找不到任何内容(即:getById返回null),则应抛出异常。

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

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

因此,如果函数/方法返回某些内容(即:它正常终止),则可以使用返回值(空数组,空字符串或空字符串都是有效的返回值)。如果函数/方法抛出异常,显然会出现问题。

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

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