22

我找到了几个对此的回应,但没有一个与 PHP(这是一种极其弱类型的语言)有关:

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

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

4

8 回答 8

39

数组是事物的集合。一个空数组表示“一切正常,该集合中什么都没有”。如果你真的想发出错误信号,你应该返回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

在特殊情况下也有错误报告的例外情况。这实际上取决于功能的职责和错误的严重程度。如果函数的角色允许响应“empty collection”和“nope”相等,上面的可能没问题。但是,如果定义的函数必须始终返回一个集合(即使它是空的)并且在某些情况下它不能,那么抛出异常可能比返回更合适。false

于 2012-07-18T07:26:22.603 回答
15

我强烈反对返回混合类型的返回值。我认为这是一个很大的问题,所以我写了一篇关于不返回混合类型值的小文章。

要回答您的问题,请返回一个空数组。下面你可以找到一个小例子,为什么返回其他值会导致问题:

// 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

希望这有助于防止一些误解。

于 2012-07-18T08:36:54.177 回答
5

就我自己而言,我通常更喜欢返回一个空数组,因为如果函数总是返回一个数组,那么将它与 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;
}
于 2012-07-18T07:19:22.360 回答
5

这是一个现代答案,可能自 1960 年代以来一直有效。

PHP 的早期版本(PHP 4 之前)中的一些糟糕的设计选择使许多 PHP 开发人员接触到了一直很糟糕的约定。幸运的是,PHP 5 来来去去——它帮助引导许多 PHP 开发人员走上“正确的道路”。

PHP 7 现在看到了经历 PHP 5 阶段的好处——它是现有执行速度最快的脚本语言之一。

  • 这使得 PHP 7 成为现有最快和最强大的脚本语言之一成为可能。

自 PHP 第 4 版以来,PHP 核心开发人员为逐步完善 PHP 语言付出了巨大的努力。许多事情仍然存在,因为我们仍然希望有一些向后兼容性。

错误时不要返回false

如果您的函数被命名为类似isEverythingFine().

false一直是返回错误的错误值。您仍然在 PHP 文档中看到它的原因是向后兼容。

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

  2. 如果你的函数应该返回布尔值以外的东西,那么你强迫自己编写代码来处理类型检查。由于许多人不进行类型检查,因此 PHP 操作码编译器也被迫编写也进行类型检查的操作码。你得到双重类型检查!

可以返回 null

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

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

如果允许值是null,则必须将其编码在单独的内存单元中,并且每当计算机需要将值传递给函数或返回它们时,它必须返回两个值。一个包含isNull,另一个用于值。

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

这并不理想,因为

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

应该抛出异常

异常与大多数 CPU 的内部工作方式相匹配。它们有一个专用的内部标志来声明发生了异常事件。

它是高效的,即使不是这样,在正常的非错误情况下我们也不会有很多额外的工作,这会带来巨大的好处。

于 2020-01-07T15:31:23.303 回答
3

这取决于情况和错误的严重程度,但一个好的(而且经常被忽视的)选择是抛出异常

<?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";
}

这将确保您的函数不会静默失败,并且不会发现错误。

于 2012-07-18T07:19:54.987 回答
2

我假设你的方法的返回类型是数组,所以只有在执行正常但没有找到结果的情况下才应该返回一个空数组。

如果发生错误,您应该抛出异常。这应该是处理错误的首选方式。

于 2013-09-13T12:43:02.967 回答
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 函数以其返回的非常不同的值让我惊叹不已。有时为假,有时为空,有时为空对象。

于 2012-07-18T07:19:34.533 回答
0

如果确实存在问题,那么您应该引发错误,否则如果不满足条件等,则返回一个空白数组。

于 2012-07-18T07:21:02.043 回答