PHP返回混合数据类型——好还是坏?

17

在 PHP 中返回值时,返回混合数据类型是好的还是不好的做法?我正在处理一些方法,这些方法会返回一个 ID 号或 null。如果返回值是 null,我会检查并返回 -1

另一种情况是有些方法应该执行某些操作并返回一个字符串,但有时由于未找到或发生异常无法返回该字符串。那么此时最好怎么办呢?返回类似于“failed”之类的字符串吗?这会导致方法之间出现字符串耦合,因为调用方法必须知道确切的失败消息才能检查结果。

编辑:看来已经有了一些不同的意见。我喜欢在失败时返回 false,在成功时返回实际结果(无论其数据类型如何)。但是……在这种情况下是否有一种事实上的最佳实践?我的意思是,其他语言(例如 Java 和 C++)中的程序员在这些情况下做什么呢?

7个回答

10

通常我会这样做,如果方法执行成功,就返回其值,如果失败则返回FALSE。这是许多PHP内置方法的做法。因此,您只需检查函数是否返回了FALSE。


1
是的,这很有道理,但我想这就是我认为不同的数据类型被返回的地方。在许多编程语言中,这并不被允许 - 这是好还是坏的做法? - david
PHP不是一种强类型语言,函数不像其他语言那样具有显式的返回类型。 - Daniel Vandersluis
例如,更新用户电子邮件地址的函数怎么样?对于成功,它应该返回“true”,但对于失败情况,电子邮件可能具有无效格式,域可能未注册,或者更新查询可能失败。在每种情况下,用户应该得到略微不同的消息。处理多个失败选项的推荐方法是什么?让函数返回错误字符串,让它返回一个int错误代码(在函数的注释中带有代码库),或抛出异常,需要由调用函数的任何内容来处理? - Mike
@Mike:个人而言,我更喜欢错误代码而不是异常,但我不知道什么是“最好”的方式。 - gen_Eric
1
坚持使用一个返回类型。在出现错误路径时,抛出一个解释错误的异常,而不是返回错误消息或代码。你的工作就是做出明智的决定。不要把错误处理责任强加给你的 API 消费者。 - Josh Johnson
显示剩余2条评论

7

当函数没有返回值时,null是一种常见的返回值。如果函数想要返回没有ID,则应该返回null(而不是“失败”或-1)。

如果未找到ID是一个特殊情况,那么应该抛出异常。


6

返回混合类型是不好的,至少在2013年是如此。 爆炸! 要走的方法是将其拆分为以下几部分:

不好的,混合返回类型样式:

function checkResult($data)
{
    if ($data) {
        ...
        return $stuff;
    } else {
        return false;
    } 
}

人们需要额外的逻辑来处理checkResult(),并且他们永远不知道它会返回什么类型。

好,明确定义返回类型的样式:

也许这个例子并不是很好,但它展示了正确的方式。

function doesResultExist($data)
{
    if ($data) {
        return true;
    }
    // default return
    return false;
}

function getResultData()
{
    ...
    return $stuff;   
}

4

我认为返回混合数据类型是一种不好的做法。虽然你指出这是可能的,但要考虑代码的可读性和可维护性。确保注释清楚你在返回什么以及为什么返回,我认为这最为重要。如果你期望返回一个整数,而你却返回了-1而非null,请加以注释,这样你(或其他人)就不必疯狂地试图弄清楚你究竟想做什么。


1
不要返回-1,最好的方法是返回false。同时,请使用文档说明函数的返回值,例如PHPDoc。 - ovais.tariq

4

我同意以上的答案。

但是,如果你设计一个完整的系统,"最佳实践"应该是使用异常:始终返回有意义的内容,在出现异常情况时抛出异常。调用者可以处理他知道如何应对的情况,并让更高级别的人捕获其余情况。


1
是的,但异常应该仅用于特殊情况。ID不存在等情况应该通过正确的返回值来处理。否则,你可能会过度使用异常并将其用于所有情况? - david
3
作为软件架构师,您可以决定何时使用它。我认为异常处理是保护代码执行的好方法。使用 "false" 返回的问题在于您不知道返回 false 的原因。因此,您必须明确地标识只有在一个情况下可以返回 false(例如“循环结束”),否则您可能会混淆不同的错误。因此,在您的 API 中,您应写入: 返回:通常情况下为字符串,在循环结束时为 false,在其他情况下抛出异常。 - greg
1
只是想+1 @Greg所说的话。如果您正在进行基于异常的编程,则返回false(或“false”)是一种反模式。 - David Welch

0
一个返回混合值的函数并不被认为是不好的。事实上,这正是 PHP 的美妙之处,因为它是一种动态语言。所以应该在失败时返回 false,在函数正确执行时返回所需的值。
if( false == ( $data = do_something() ) ) return false;
else print_r( $data );

4
你应该使用===而不是==0 == false的结果为真。 - Daniel Vandersluis
1
0 == false 是真的,null == false 也是真的,'' == false 也是如此等等。使用 === 或 == 通常取决于具体情况。 - ovais.tariq

0

此答案需要更新。自 PHP 7.1 起有更好的解决方案:

如果我想返回一个字符串但它可能为null,我会这样做:

    function myFunction(): ?string{
        //do things here and return string or null
    }

在字符串前面的问号实际上表示 null 或字符串作为返回类型。这使您可以拥有有限的返回类型,但仍允许 null。这适用于所有类型。

您可以在此处阅读更多信息 PHP 手册 - 返回值


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