我有一个函数,将从一些数据库执行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是一个空数组时,最后这些示例将简单地给出一个空页面。第一个示例将说没有结果。