在for循环中使用stdClass()时,所有值都相同

时间:2014-08-01 13:14:39

标签: php sql-server-2008

我在下面有一个函数getComment。这个功能的问题在于

$test->TestComments[$type]将包含相同的值,namley最后一条评论及其用户名和时间戳。

public function getComment($test) {
    $Id = $test->Id;
    $localComment = new stdClass();
    $queryComment = $this->getResultCommentQuery($Id);
    $result = odbc_exec($this, $queryComment);
    $no_results = odbc_num_rows($result);

    for ($i = 1; $i <= $no_results; $i++) {
        odbc_fetch_row($result, $i);
        $type = trim(odbc_result($result, "result"));
        $localComment->Comment = trim(odbc_result($result, "comment"));
        $localComment->Username = trim(odbc_result($result, "username"));
        $localComment->Timestamp = trim(odbc_result($result, "timestamp"));
        $test->TestComments[$type] = $localComment;//there are no unique
 //values here, every comment will have the same "timestamp", "comment", and "username", namley the last one.
echo($localComment->Comment);//If I do this I see that there are different values.
        }
        return $test; //But this will only contain a correct nr of array attributes with same content (last comment info), see bellow.
    }

例如我得到的东西。

    TestComments":{"Pay":{"Comment":"Test","Username":"en","Timestamp":"2014-08-01 14:27:41.410"},
"Peak":{"Comment":"Test","Username":"en","Timestamp":"2014-08-01 14:27:41.410"}}

这就是我得到两次相同的内容而不是两行具有不同的值。有人看到可能出错的地方吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

你的问题是使用

$test->TestComments[$type] = $localComment;

这不符合你的想法。它实际上是将引用复制到对象$test->TestComments[$type]而不是对象本身的内容。

因为您只有一个实际的$localComment对象,所有这些引用都指向一个对象,该对象将包含最后放入对象的内容。

你真正想做的是CLONE这个对象,它创建了一个对象的副本,而不只是为原始对象分配一个引用。

所以改变这一行

$test->TestComments[$type] = $localComment;

$test->TestComments[$type] = clone $localComment;

并且您现有的代码应该按预期工作。