-1作为返回值

时间:2012-06-17 15:36:39

标签: php

这个问题是关于PHP的,但我猜它也可能适用于其他语言。

我注意到在PHP4和PHP5之间,语言的设计者从使用-1作为返回值转向使用常量或其他形式的输出。这是有道理的,因为-1并不是特别令人回味,而且我猜这种做法导致了混乱。

那就是说,当我想快速为函数添加另一个返回选项时,我有时倾向于返回-1,而-1通常似乎是表达我编码结果的完全有效的方式对于。

所以这是我的问题:

  1. 我的观察结果是否正确,关于从-1转移到PHP5与PHP4的返回值?

  2. 返回-1有什么缺点,除了上面提到的原因,其中-1返回值对代码清晰度没有贡献?

3 个答案:

答案 0 :(得分:6)

这只是一种预感,但根据我的经验,在PHP中设计选择几乎没有理由或一致性。我还发现许多函数在失败时返回FALSE,许多函数添加了一条注释,您必须明确区分FALSE和强制转换为FALSE的其他(有效)值,例如0。在这种情况下,我认为-1很多更好的返回值。

当然,你总是可以返回-1并定义具有有意义名称的常量,并且只是映射到-1

答案 1 :(得分:2)

我猜想任何仍然返回-1的PHP函数都是出于遗留原因这样做的。

对于简单的函数,如果有一个逻辑的,合理的错误响应,不涉及返回一个神秘的数字代码,那么应该使用它。例如,返回nullfalse0可能足以传达所发生的事情。但是对于更复杂的功能,特别是那些可以有多种故障模式的功能,可以考虑将它们分解成不同的功能,每个功能处理整个任务的一小部分。

你也可以抛出异常:

function doSomething() {
    if (fooFails()) {
        throw new Exception('Foo failed to work properly.');
    } else if (barFails()) {
        throw new Exception('Bar failed this time.');
    }

    return "blahblah";
}

您还可以对Exception类进行子类化以提供更多特异性,并且可以使用try-catch块检测哪一个。总的来说,我认为最好使用像这样的面向对象的原则。它产生的代码更清晰,更易于维护,尤其是在您完全忘记为什么以您的方式编写代码之后的6个月内。

class FooException extends Exception {
    // nothing else needed here
}

class BarException extends Exception {
    // nothing else needed here
}

function doSomething() {
    if (fooFails()) {
        throw new FooException();
    } else if (barFails()) {
        throw new BarException();
    }

    return "blahblah";
}

然后你可以使用:

try {
    $output = doSomething();

} catch (FooException $e) {
    // respond to the FooException case

} catch (BarException $e) {
    // respond to the BarException case

} catch (Exception $e) {
    // respond to any and all other exceptions that might be thrown
}

答案 2 :(得分:1)

这是一个品味问题。我个人更喜欢使用数字。他们看起来更好。

但在某些情况下,更优选使用truefalse。像这样:

function isXYZ($a) {
    if (...) return true;
    return false;
}