具有不同值的相同对象属性

时间:2015-04-08 21:59:01

标签: php

我在一个函数中出现问题,对我来说这很奇怪,因为我认为对象的行为是不同的。功能是:

function getMessages($imapCon)
{
    $messageHeaders = array();
    $tempObj = new stdClass();
    $totalMessages = imap_num_msg($imapCon);
    for ($i = $totalMessages; $i > 0; $i--) 
    {
        $headers = imap_headerinfo($imapCon, $i);
        $tempObj->Unseen = $headers->Unseen;
        $tempObj->fromaddress = $headers->fromaddress;
        $tempObj->Date = $headers->Date;
        $tempObj->Subject = $headers->Subject;
        $tempObj->uid = imap_uid($imapCon, $i);
        array_push($messageHeaders, $tempObj);
    }       
    return json_encode($messageHeaders);
}

在json编码中,我得到所有属性的相同值(Unseen,fromaddress,Date ...)。属性设置正确,但值重复。为什么? 如果我这样做:

    for ($i = $totalMessages; $i > 0; $i--) 
    {
        $tempObj = new stdClass();
        ...
        array_push($messageHeaders, $tempObj);
        unset($tempObj);
    }       
    return json_encode($messageHeaders);
}

声明for中的对象,它有效。但我相信这是一个糟糕的解决方案,也不是正确的事情......

2 个答案:

答案 0 :(得分:0)

每次看起来你只是pushing a reference $messageHeaders数组,但是你在同一个实例上重新分配数据。不知道你在哪里知道在每次迭代中创建一个新的$tempObj是错误的,但这是你可以解决这个问题的一种方法。另一种方法是直接添加到$messageHeaders数组,如下所示:

$messageHeaders[] = array(
    'Unseen' => $headers->Unseen,
    'fromaddress' => $headers->fromaddress,
    'Date' => $headers->Date,
    'Subject' => $headers->Subject,
    'uid' => imap_uid($imapCon, $i)
);

答案 1 :(得分:0)

在循环中创建一个新的$ tempObj是正确的方法。将此对象添加到数组中时,它不会被复制,但会将指向它的指针添加到数组中。查看此文档 - http://php.net/manual/en/language.oop5.basic.php#example-191(查看简单赋值,暂时忽略$引用变量)。

所以你最终得到的数组包含指向同一个对象的一大堆链接。但是如果你在循环中创建一个新的$ tempObj,那么所有对象都将是不同的。

或者,你可以这样做:

array_push($messageHeaders, clone($tempObj));

但是在这种情况下这同样有效,但如果$ tempObj具有更复杂的结构,例如其他类的实例作为$ tempObj的属性,它可能无法工作。

另外,在PHP4中,您的代码可以正常工作,因为PHP4在分配时复制实际对象而不是像PHP5那样只是指针。