Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 具有不同值的相同对象属性_Php - Fatal编程技术网

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
在每个循环中都是相同的对象。