xtr*_*nge 22 php methods return-value
我找到了几个回复,但没有一个与PHP有关(这是一种非常弱的类型语言):
关于PHP,是否适合在通常返回数组但却发生故障的方法中返回false,null或空数组?
换句话说,如果另一位开发人员加入我的项目,他们会期望看到什么?
dec*_*eze 37
数组是一组东西.一个空数组会发出"一切都很好,那个集合中没有任何东西"的信号.如果您确实想要发出错误信号,则应该返回false
.由于PHP是动态类型的,因此很容易根据您的需要严格或松散地检查返回值:
$result = getCollection();
if (!$result) // $result was false or empty, either way nothing useful
if ($result === false) // an actual error occurred
if ($result) // we have an array with content
Run Code Online (Sandbox Code Playgroud)
也有例外的错误报告中的特殊情况.这实际上取决于函数的职责和错误的严重程度.如果函数的作用允许响应"空集合"和"nope"同等,则上述可能没问题.但是,如果定义的函数必须始终返回一个集合(即使它是空的),并且在某些情况下它不能,抛出异常可能比返回更合适false
.
mar*_*kli 13
我强烈反对返回混合类型返回值.我认为这是一个很大的问题,我写了一篇关于不返回混合类型值的小文章.
要回答您的问题,请返回一个空数组.下面你可以找到一个小例子,为什么返回其他值会导致问题:
// This kind of mixed-typed return value (boolean or string),
// can lead to unreliable code!
function precariousCheckEmail($input)
{
if (filter_var($input, FILTER_VALIDATE_EMAIL))
return true;
else
return 'E-Mail address is invalid.';
}
// All this checks will wrongly accept the email as valid!
$result = precariousCheckEmail('nonsense');
if ($result == true)
print('OK'); // -> OK will be given out
if ($result)
print('OK'); // -> OK will be given out
if ($result === false)
print($result);
else
print('OK'); // -> OK will be given out
if ($result == false)
print($result);
else
print('OK'); // -> OK will be given out
Run Code Online (Sandbox Code Playgroud)
希望这有助于防止一些误解.
就我自己而言,我通常更喜欢返回一个空数组,因为如果函数总是返回一个数组,那么将它与 PHP 的数组函数和 foreach 一起使用是安全的(它们将接受空数组)。如果返回 null 或 false,则必须在将结果传递给数组函数之前检查结果的类型。
如果你需要区分方法正确执行但没有找到任何结果的情况,以及方法中发生错误的情况,那么这就是异常出现的地方。在前一种情况下,返回一个空数组是安全的. 在后者中,仅仅返回一个空数组不足以通知您发生错误的事实。但是,如果您返回数组以外的内容,则必须在调用代码中处理它。抛出异常可让您在适当的错误处理程序中的其他位置处理错误,并让您将消息和代码附加到异常以描述失败发生的原因。
如果我们没有找到任何感兴趣的东西,下面的伪代码将简单地返回一个空数组。但是,如果在处理我们返回的事物列表时出现问题,则会引发异常。
method getThings () {
$things = array ();
if (get_things_we_are_interested_in ()) {
$things [] = something_else ();
}
if (!empty ($things)) {
if (!process_things ($things)) {
throw new RuntimeExcpetion ('Things went wrong when I tried to process your things for the things!');
}
}
return $things;
}
Run Code Online (Sandbox Code Playgroud)
这是一个现代答案,可能自 1960 年代以来一直有效。
PHP 早期版本(PHP 4 之前)中的一些糟糕的设计选择使许多 PHP 开发人员接触到一直很糟糕的约定。幸运的是,PHP 5 来来去去——它帮助许多 PHP 开发人员走上了“正确的道路”。
PHP 7 现在看到了通过 PHP 5 阶段的好处 - 它是现有执行速度最快的脚本语言之一。
从 PHP 4 开始,PHP 核心开发者付出了巨大的努力来逐步完善 PHP 语言。许多东西仍然存在,因为我们仍然希望有一些向后兼容性。
不要在错误时返回false
如果出现错误,您唯一可以返回 FALSE 的情况是,如果您的函数名为
isEverythingFine()
.
false
一直是错误的值返回错误。您仍然在 PHP 文档中看到它的原因是因为向后兼容。
这将是不一致的。在您的函数应该返回布尔值true
或的情况下,您会返回什么错误false
?
如果你的函数应该返回布尔值以外的东西,那么你就强迫自己编写代码来处理类型检查。由于许多人不进行类型检查,因此 PHP 操作码编译器也被迫编写也进行类型检查的操作码。你会得到双重类型检查!
你可能会返回 null
大多数脚本语言都null
对其数据类型中的值进行了有效的规定。理想情况下,您甚至不使用该值类型 - 但如果您不能抛出异常,那么我更喜欢null
. 它是 PHP 中所有数据类型的有效“值”——即使它在 PC 内部不是有效值。
最适合计算机/CPU 的是整个值位于单个 1、2、4 或 8 字节内存“单元”中。这些值大小对于所有本机值类型都是通用的。
如果允许值为null
,则必须将其编码在单独的内存单元中,并且每当计算机需要将值传递给函数或返回它们时,它必须返回两个值。一个包含isNull
另一个值。
您可以根据类型返回特殊值
这并不理想,因为
你应该抛出异常
例外与大多数 CPU 的内部工作原理相匹配。它们有一个专用的内部标志来声明发生了异常事件。
它非常高效,即使不是这样,我们也有巨大的好处,即在正常的非错误情况下无需进行大量额外工作。