4

这个问题专门针对 PHP,但我猜它也可能适用于其他语言。

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

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

所以这是我的问题:

  1. -1关于在 PHP5 和 PHP4 中作为返回值的远离,我的观察是否普遍正确?

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

4

3 回答 3

6

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

当然,您总是可以只返回-1并定义具有有意义名称且仅映射到-1.

于 2012-06-17T15:40:01.643 回答
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
}
于 2012-06-17T15:47:23.910 回答
1

那是口味问题。我个人更喜欢使用数字。它们对我来说看起来更好。

但在某些情况下,使用trueandfalse更为可取。像这个:

function isXYZ($a) {
    if (...) return true;
    return false;
}
于 2012-06-17T15:47:36.540 回答