在php中,我应该在通常返回数组的方法中返回false,null或空数组吗?

时间:2012-07-18 07:16:41

标签: php methods return-value

我找到了几个回复,但没有一个与PHP有关(这是一种非常弱的类型语言):

关于 PHP ,是否适合在通常返回数组的方法中返回false,null或空数组,但是发生了故障?

换句话说,如果另一位开发人员加入我的项目,他们会期望看到什么?

8 个答案:

答案 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 7成为现有最快,功能最强大的脚本语言之一。

自PHP版本4起,PHP核心开发人员为逐步改进PHP语言付出了巨大的努力。仍然有很多事情,因为我们仍然希望具有一些向后兼容性。

请勿在错误时返回 false

在错误的情况下,唯一可以返回FALSE的地方就是您的函数被命名为isEverythingFine()之类的东西。

false始终是错误的值,以返回错误。之所以在PHP文档中仍然看到它,是因为向后兼容。

  1. 这将是不一致的。在应该函数返回布尔值truefalse的情况下,错误返回什么?

  2. 如果您的函数应该返回布尔值以外的其他值,则您将强制自己编写代码以处理类型检查。由于许多人不进行类型检查,因此PHP操作码编译器也被迫编写也进行类型检查的操作码。 您将进行双重类型检查!

可能返回空值

大多数脚本语言已对其数据类型中的null值做出了有效的规定。理想情况下,您甚至不使用该值类型-但是如果您不能引发异常,那么我更喜欢null。对于PHP中的所有数据类型,它都是有效的“值”,即使该值在PC内部不是有效的值。

对于计算机/ CPU而言,最理想的是整个值位于单个1、2、4或8字节内存“单元”中。这些值大小对于所有本机值类型都是通用的。

当允许将值设为null时,则必须在单独的存储单元中对其进行编码,并且每当计算机需要将值传递给函数或返回它们时,它都必须返回两个值。一个包含isNull,另一个包含值。

可能根据类型返回一个特殊值

这不理想,因为

  • 如果您的函数应该返回整数,则返回-1。
  • 如果您的函数应该返回字符串

应该抛出异常

异常符合大多数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)

如果确实存在问题,则应引发错误,否则如果不符合条件等,则返回空白数组。