作为条件的一部分,在变量赋值期间丢失数组

时间:2013-07-13 15:19:58

标签: php

我正在尝试对一些代码进行故障排除,并且发生了一些我无法理解的事情...我有一个$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。

3 个答案:

答案 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)
  1. $forum->threadExists($thread_id) || $test['topic_id'] != $topic_id分配给$test
  2. 取消并检查$test
  3. 的值

    由于$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) {