测试var是否为array/空array/false


testing for var that might be array/empty array/false

我有一个函数,将从一些数据库执行SELECT查询并返回:

  • false(以防出错)
  • 一个空数组array(0) { }
  • 关联数组

为了测试这个函数的返回值,这样做是否比较好:

$someVar = $this->someFunction();
if ($someVar) {
    // ok, this is an associative array of result
} else {
    // $someVar = false OR $someVar is an empty array
}

或者我必须这样做:

$someVar = $this->someFunction();
if (is_array($someVar) && count($someVar) > 0) {
    // ok, this is an associative array of result
} else {
    // $someVar = false OR $someVar is an empty array
}

第一个测试似乎做了我想要的,但也许我错过了一些可能会出错的东西。

那么,它是很好的实践测试数组就像我在我的第一个例子吗?

都不是

返回false以指示错误在非常低的水平是很好的,但是在你的低级查询和你的应用程序代码之间应该有一个层,检查返回值并在false上抛出异常。调用您的代码的顶级控制器应该处理这些异常(之前没有捕获),并在生产中显示用户友好的错误页面,或者在开发中转储调试信息,同时记录错误。

绝对不应该在应用程序中使用三路if/elseif/else分支来检查每个数据库查询的返回值。这是一种令人难以置信的过时的检查错误的方式。

抛出异常,你可以使用第一种形式(if ($someVar)),或者,更好的是:

foreach ($this->someFunction() as $key => $row) {

}

http://php.net/manual/en/types.comparisons.php

空数组的计算结果为false。包含值的数组的计算结果为true(即使所有值单独计算结果为false)。

你也可以检查if (empty($array)),但是这样做是多余的,除非你担心数组变量没有被设置。

最后,如果数组为空,则$array == false为真,但$array === false不为真。

根据类型比较的文档,你的第一种方法是完全可以接受的。空数组的值始终为FALSE。

文档:http://php.net/manual/en/types.comparisons.php

也就是说,您可以选择以不同的方式处理无结果和错误,例如将错误消息记录到服务器日志中。在这种情况下,您可能需要多个if()条件。

都不是。测试所有三种情况:

if (false === $result) {
    die('There is an error!');
} elseif (empty($result)) {
    die('No results found');
}
foreach ($result as $foo) { ... }

如果您真的只想测试两个,那么请记住foreach将在空数组中工作。因此,这将工作:

if (false === $result) {
    die('There was an error!');
}
foreach ($result as $foo) { ... }

或:

if (false === $result) {
    echo 'There was an error!';
} else {
    foreach ($result as $foo) { ... }
}

当$result是一个空数组时,最后这些示例将简单地给出一个空页面。第一个示例将说没有结果。