我有一个函数将从某个db执行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
}
第一次测试似乎做了我想做的事,但也许我错过了可能出错的事情。
那么,像我在第一个例子中所做的那样,测试数组是否很好?
答案 0 :(得分:2)
都不是。
返回false
以指示错误在非常低的级别上是正常的,但是在您的低级查询和应用程序代码之间应该有一层检查返回值并在false
上引发异常。调用代码的顶级控制器应该处理这些异常(之前没有捕获)并在生产中显示用户友好的错误页面,或者在开发过程中转储调试信息,同时记录错误。
绝对没有办法在应用程序中执行三向if/elseif/else
分支来检查每个数据库查询的返回值。这是一种令人难以置信的过时的检查错误的方式。
抛出异常,你可以使用你的第一个表单(if ($someVar)
),或者更好的是:
foreach ($this->someFunction() as $key => $row) {
}
答案 1 :(得分:1)
http://php.net/manual/en/types.comparisons.php
空数组的计算结果为false。值的数组计算结果为true(即使所有值都单独计算为false)。
您也可以检查if (empty($array))
,但这样做是多余的,除非您担心未设置数组变量。
最后,如果数组为空,$array == false
为真,但$array === false
不是。
答案 2 :(得分:1)
根据类型比较的文档,您的第一种方法是完全可以接受的。空数组总是评估为FALSE。
文档:http://php.net/manual/en/types.comparisons.php
也就是说,您可以选择以不同的方式处理结果和错误,例如将错误消息记录到服务器日志。在这种情况下,您可能需要多个if()
条件。
答案 3 :(得分:0)
都不是。测试所有三种情况:
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为空数组时,这些最后的示例将简单地给出一个空页面。第一个例子说没有结果。