【问题标题】:Assigning object property inside a foreach loop; data does not persist outside foreach loop. Why not? INT and STRING assignment does work在 foreach 循环中分配对象属性;数据不会在 foreach 循环之外持续存在。为什么不? INT 和 STRING 分配确实有效
【发布时间】:2012-12-22 20:41:44
【问题描述】:

一整天都在把我的头从桌子上敲下来。

    // Iterate over project array to populate release data
    for ($i = 0; $i < count($data); $i++) {
        $data[$i]->setProjectReleaseSchedule( $proj_scheds[$i] );

            //Get each projects Est and Act hours
            $options = new stdClass;
            $options->default       = true;
            $options->project_id    = $data[$i]->getProjectId();
            $options->department_id = $person_dm->getPersonDepartmentId();

            //works; AKA: property get assigned an int thatr incriments evern loop
            //$data[$i]->data->proj_hours = $this->counter++;

            //$weekly_report_dm->getProjectHours returns an object w/ populated properties
            $data[$i]->data->proj_hours = $weekly_report_dm->getProjectHours($options);

            //As a test, this dumps what is expected...
            echo'<pre>';
            print_r( $data[$i]->data->proj_hours );
            echo'</pre>';

    }


echo'<pre>';
//After the loop completes and I try to dump the data the property $data->data->proj_hours is assigned an object..
//but the object properties are all null :(.
print_r( $data );
echo'</pre>';
exit;

所以你可以看到我在一个对象数组上循环;对于每个对象,我都有另一种数据方法,它返回预期的数据。 “print_r($data[$i]->data->proj_hours);”。但是,一旦循环完成并且我尝试转储该对象分配给父对象的数据,但所述对象的属性为空/空白。

所以问题是:为什么我可以将 INT、STRINGS 等分配给对象属性,并且它们会在 foreach 循环之外持续存在。但是在 foreach 循环中将对象属性分配给父对象时,这些值不会持续存在?

【问题讨论】:

  • 你看过$weekly_report_dm-&gt;getProjectHours($options);返回什么吗?
  • 我有,它按预期返回数据。
  • 疯狂猜测 - $weekly_report_dm-&gt;getProjectHours($options) 不是返回对更改每次调用的相同私有属性的引用吗?有的话可以试试$data[$i]-&gt;data-&gt;proj_hours = clone $weekly_report_dm-&gt;getProjectHours($options);
  • 你确定 for 循环中新 StdClass 的实例化不取决于结果吗?为什么要在循环内实例化它?之前不能实例化吗?
  • jasir:用'clone'关键字尝试过......你是神。请将其发布为答案,以便我 +1 你。 art2:是的,我可能应该在循环之外这样做。 +1 为指针。谢谢你们的帮助,正是我所寻求的。

标签: php loops properties spl


【解决方案1】:

weekly_report_dm-&gt;getProjectHours($options) 似乎返回对相同私有 (?) 属性的引用,这会更改每次调用。您可以尝试使用clone 克隆结果:

$data[$i]->data->proj_hours = clone $weekly_report_dm->getProjectHours($options);

getProjectHours 更改为 不返回 引用将是正确的解决方案

【讨论】:

    【解决方案2】:

    在顶部,外部 for 循环添加:

    $filler = array();
    

    在for循环内添加:

    $filler[] = $data[$i]->data->proj_hours;
    

    然后尝试转储数据。

    print_r($filler);
    

    希望这会给你带来一些结果。

    【讨论】:

    • 已经试过了。 '$filler' 将具有属性,但值为 null。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多