我找到了几个回复,但没有一个与PHP有关(这是一种非常弱的类型语言):
关于 PHP ,是否适合在通常返回数组的方法中返回false,null或空数组,但是发生了故障?
换句话说,如果另一位开发人员加入我的项目,他们会期望看到什么?
答案 0 :(得分: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
在例外案例中,还有例外用于错误报告。这实际上取决于函数的职责和错误的严重程度。如果函数的作用允许响应“空集合”和“nope”同等,则上述可能没问题。但是,如果定义的函数必须始终返回一个集合(即使它是空的),并且在某些情况下它不能,抛出异常可能比返回false
更合适。
答案 1 :(得分:12)
我强烈建议不要返回混合类型的返回值。我认为这是一个很大的问题,我写了一篇关于not returning mixed typed values的小文章。
要回答您的问题,请返回一个空数组。下面你可以找到一个小例子,为什么返回其他值会导致问题:
// 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
希望这有助于防止一些误解。
答案 2 :(得分:4)
就我自己而言,我通常更喜欢返回一个空数组,因为如果函数总是返回一个数组,那么将它与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;
}
答案 3 :(得分:4)
这是一个自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
。对于PHP中的所有数据类型,它都是有效的“值”,即使该值在PC内部不是有效的值。
对于计算机/ CPU而言,最理想的是整个值位于单个1、2、4或8字节内存“单元”中。这些值大小对于所有本机值类型都是通用的。
当允许将值设为null
时,则必须在单独的存储单元中对其进行编码,并且每当计算机需要将值传递给函数或返回它们时,它都必须返回两个值。一个包含isNull
,另一个包含值。
您可能根据类型返回一个特殊值
这不理想,因为
您应该抛出异常
异常符合大多数CPU的内部工作原理。它们具有专用的内部标志来声明发生了异常事件。
这是非常高效的,即使不是,我们也有巨大的好处,那就是在正常的非错误情况下无需进行大量额外的工作。
答案 4 :(得分:2)
这取决于具体情况和错误的严重程度,但throw an exception是一个好的(经常被忽视的)选项:
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division by zero.');
}
else return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
这将确保您的功能不会无声地失败,并且不会发现错误。
答案 5 :(得分:1)
我假设你的方法的返回类型是数组,所以你应该只在执行正常但没有找到结果的情况下返回一个空数组。
如果出现错误,您应该抛出异常。这应该是处理错误的首选方法。
答案 6 :(得分:0)
无论你喜欢什么,虽然我建议一个空数组,这是有充分理由的。您不必先检查类型!
<?php
function return_empty_array() {
return array();
}
$array = return_empty_array();
// there are no values, thus code within doesn't get executed
foreach($array as $key => $value) {
echo $key . ' => ' . $value . PHP_EOL;
}
?>
在任何其他情况下,如果你返回false或null,你会在foreach循环中出错。
这是一个微不足道的差异,虽然在我看来是一个很大的差异。我不想检查我得到了什么类型的值,我想假设它是一个数组。如果没有结果,则它是一个空数组。
无论如何,就我而言,没有“默认值”来返回空值。原生PHP函数让我惊叹于它返回的非常不同的值。有时是假的,有时是空的,有时是空的对象。
答案 7 :(得分:0)
如果确实存在问题,则应引发错误,否则如果不符合条件等,则返回空白数组。