我正在尝试对一些代码进行故障排除,并且发生了一些我无法理解的事情...我有一个$forum
对象,其中包含threadExists
方法,该方法返回一个关联找到的任何结果的数组或false
否则。
以下将按预期打印数组:
if (!$test = $forum->threadExists($thread_id)) {
// do something
}
echo '<pre>';
var_dump($test);
echo '</pre>';
exit;
然而;通过添加条件,屏幕将只打印bool(true)
:
if (!$test = $forum->threadExists($thread_id) || $test['topic_id'] != $topic_id) {
// do something
}
echo '<pre>';
var_dump($test);
echo '</pre>';
exit;
为什么数组会丢失?
我正在使用PHP 5.4.12。
答案 0 :(得分:2)
运算符优先级使其被解释为此
if (!($test = ($forum->threadExists($thread_id) || $test['topic_id'] != $topic_id))) {
// do something
}
更清楚,
$test = $forum->threadExists($thread_id) || $test['topic_id'] != $topic_id;
if (!$test) {
// do something
}
您可以使用括号
强制执行正确的行为if (!($test = $forum->threadExists($thread_id)) || $test['topic_id'] != $topic_id) {
// do something
}
就个人而言,我会像下面这样写,因为我讨厌的代码甚至有点难以阅读
$test = $forum->threadExists($thread_id);
if (!$test || $test['topic_id'] != $topic_id) {
// do something
}
答案 1 :(得分:1)
这样读:
if(!$test = $forum->threadExists($thread_id) || $test['topic_id'] != $topic_id)
$forum->threadExists($thread_id) || $test['topic_id'] != $topic_id
分配给$test
$test
由于$forum->threadExists($thread_id) || $test['topic_id'] != $topic_id
的评估结果为true
,因此您将true
分配给$test
。
修复是:
if((!$test = $forum->threadExists($thread_id))||($test['topic_id'] != $topic_id))
答案 2 :(得分:1)
括号问题。您将$test
分配给复合条件的值,因此它将具有一个布尔值,该值基于它的任一侧是否解析为true。尝试:
if (!($test = $forum->threadExists($thread_id)) || $test['topic_id'] != $topic_id) {