这个问题是关于PHP的,但我猜它也可能适用于其他语言。
我注意到在PHP4和PHP5之间,语言的设计者从使用-1
作为返回值转向使用常量或其他形式的输出。这是有道理的,因为-1
并不是特别令人回味,而且我猜这种做法导致了混乱。
那就是说,当我想快速为函数添加另一个返回选项时,我有时倾向于返回-1
,而-1
通常似乎是表达我编码结果的完全有效的方式对于。
所以这是我的问题:
我的观察结果是否正确,关于从-1
转移到PHP5与PHP4的返回值?
返回-1
有什么缺点,除了上面提到的原因,其中-1
返回值对代码清晰度没有贡献?
答案 0 :(得分:6)
这只是一种预感,但根据我的经验,在PHP中设计选择几乎没有理由或一致性。我还发现许多函数在失败时返回FALSE
,许多函数添加了一条注释,您必须明确区分FALSE
和强制转换为FALSE
的其他(有效)值,例如0
。在这种情况下,我认为-1
是很多更好的返回值。
当然,你总是可以返回-1
并定义具有有意义名称的常量,并且只是映射到-1
。
答案 1 :(得分:2)
我猜想任何仍然返回-1的PHP函数都是出于遗留原因这样做的。
对于简单的函数,如果有一个逻辑的,合理的错误响应,不涉及返回一个神秘的数字代码,那么应该使用它。例如,返回null
,false
或0
可能足以传达所发生的事情。但是对于更复杂的功能,特别是那些可以有多种故障模式的功能,可以考虑将它们分解成不同的功能,每个功能处理整个任务的一小部分。
你也可以抛出异常:
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)
这是一个品味问题。我个人更喜欢使用数字。他们看起来更好。
但在某些情况下,更优选使用true
和false
。像这样:
function isXYZ($a) {
if (...) return true;
return false;
}