PHP最佳实践:使用混合返回类型

5
我知道这个主题在这里有过简短的讨论,但我希望了解在PHP中使用多种返回类型的一般要点和注意事项。对于此功能,似乎存在不同的意见。
我倾向于同意上面链接中指出的,对于错误,使用异常可能更合适;但是,如果一个函数返回两种有意义的值,该怎么办呢?例如,假设一个函数返回房子里所有关着灯的电灯(:)是的,我在胡说八道!)
基本上,这就是我想表达的:如果基本条件没有满足,我看不到继续计算我的列表的意义,我会返回一个布尔值。否则,请继续进行:
    public function getLightsThatAreOff($house) 
    {
        // if $house itself does not have any power, return true 
        // else 
              //compile an array of lights that are off and return then
    }

我认为上述使用案例是多返回类型的一个甜点。无论如何,如果有人提供一组确定是否使用此功能的通用准则,我将不胜感激。

谢谢!


我个人认为,只有在电源开启时,getLightsThatAreOff() 才有意义。当电源关闭时调用它会得到无意义的结果,我想说。 - Levi Morrison
2个回答

10

即使有文档记录,混合类型也不是好的选择。例如,如果一个方法应该返回一个数组,但没有什么可以返回的时候,它应该是一个空数组,而不是 false 或其他什么。

array()

1
我想保守一点可能是一个好策略:尽可能避免混合使用不同类型的数据? - user2334532
1
是的,尽量避免混合编程 - 大多数情况下都是可以避免的。 - Eddie Jaoude
此外,PHP7的严格类型不允许混合类型或空值。 - Eddie Jaoude

0

这真的取决于您打算如何使用这些函数。即使您是一个大型开发团队的一部分,只要您有效地记录代码,那么您应该能够安全地返回混合类型。如果您是为自己开发,那么实际上并不重要,只要您知道如何以及在哪里使用您的函数。

我会说,从个人经验来看,只要您能减轻错误的可能性,就应该这样做。也就是说,如果函数的预期返回值是数组,则应该返回空数组而不是布尔值(false)。这样,即使有人没有阅读您的文档,最坏的情况也只是当他们尝试循环遍历数组时,什么都不会发生,脚本会继续执行。如果您无法预见它会引起任何问题,我强烈建议您这样做,而不是简单地返回false。我甚至数不清有多少次我听到“您的数据库类已损坏”,因为我返回了false而不是查询失败的结果数组。


5
无论你是否属于一个团队都无关紧要,你应该总是以最合理、最少缺陷的方式编写函数。混合返回类型的缺陷可能是处理调用者端的返回值时会增加负担。 - deceze
同意@deceze的观点。然而 PHP 本身经常返回混合类型。即使是最新版本(7+)。password_hash()是一个例子。 - Felipe Alameda A
返回空数组在某些情况下可能是正确的,但这取决于具体情况。如果需要/期望带有数据的数组,则其他任何内容都可能被视为问题/错误。因此,抛出异常或返回null。人们可能会执行is_array,然后开始循环。或者必须检查是否可迭代以及是否具有值。在我看来,这比仅使用=== null或在简单的try/catch中包装要麻烦得多。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接