Php 具有不同值的相同对象属性
我在一个函数中遇到了一个问题,对我来说这很奇怪,因为我认为对象的行为是不同的。功能是:Php 具有不同值的相同对象属性,php,Php,我在一个函数中遇到了一个问题,对我来说这很奇怪,因为我认为对象的行为是不同的。功能是: function getMessages($imapCon) { $messageHeaders = array(); $tempObj = new stdClass(); $totalMessages = imap_num_msg($imapCon); for ($i = $totalMessages; $i > 0; $i--) { $hea
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中声明对象时,它会起作用。但我认为这是一个糟糕的修复,也不是正确的做法…看起来您每次都只是进入
$messageHeaders
数组,但您正在重新分配同一实例上的数据。不确定您是从哪里得到这样的想法的:在每次迭代中创建一个新的$tempObj
是错误的,但这是解决这个问题的一种方法。另一种方法是直接添加到$messageHeaders
数组,如下所示:
$messageHeaders[] = array(
'Unseen' => $headers->Unseen,
'fromaddress' => $headers->fromaddress,
'Date' => $headers->Date,
'Subject' => $headers->Subject,
'uid' => imap_uid($imapCon, $i)
);
在循环中创建一个新的$tempObj是正确的方法。将此对象添加到数组中时,不会复制它,但会将指向它的指针添加到数组中。检查此文档-(查看简单赋值,暂时忽略$reference变量) 因此,最终得到的数组包含指向同一对象的全部链接。但是如果在循环中创建一个新的$tempObj,所有对象都将不同 或者,您可以执行以下操作:
array_push($messageHeaders, clone($tempObj));
但是,尽管这在本例中同样有效,但如果$tempObj具有更复杂的结构,例如作为$tempObj属性的其他类的实例,则可能不起作用
另一方面,在PHP4中,您的代码将按照您的预期工作,因为PHP4在赋值时复制实际对象,而不是像PHP5那样只复制指针。这实际上是正确的做法。
for循环中的$tempObj
在每个循环中都是相同的对象。