我在一个函数中出现问题,对我来说这很奇怪,因为我认为对象的行为是不同的。功能是:
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中的对象,它有效。但我相信这是一个糟糕的解决方案,也不是正确的事情......
答案 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那样只是指针。