首页 > 解决方案 > 对象被神秘地覆盖

问题描述

$this->processes->data每次我打电话时都会以某种方式扩展$this->load_operations()。当我的代码显然没有修改它时,我真的不明白为什么该对象会发生变化。

我错过了什么吗?

如果我将$process(在 foreach 中)转换为数组,然后再返回对象$this->processes->data,则不会扩展。

$process = (array) $process;
$process = (object) $process;
class Test_library
{
    private $processes;
    private $tasks;
    private $operations;

    public function __construct()
    {
        $this->processes = (object) array(
            'data' => (object) array(
                '3' => (object) array(
                    'id' => '3',
                )
            )
        );

        $this->tasks = (object) array(
            'data' => (object) array(
                '5' => (object) array(
                    'id' => '5',
                    'processes_id' => '3',
                ),
                '6' => (object) array(
                    'id' => '6',
                    'processes_id' => '3',
                )
            )
        );

        $this->operations = (object) array(
            'processes' => (object) array(
                '3' => (object) array(
                    'id' => '3',
                    'data' => array()
                )
            )
        );

        print_r($this->processes->data);

        $this->load_operations();

        print_r($this->processes->data);
    }

    private function load_operations()
    {
        if(!empty($this->processes->data))
        {
            foreach($this->processes->data as $process)
            {
                $this->operations->processes->{$process->id} = $process;
            }
        }

        if(!empty($this->tasks->data))
        {
            foreach($this->tasks->data as $task)
            {
                $this->operations->processes->{$task->processes_id}->data[] = (object) [
                    'machine' => [],
                    'task' => $task
                ];
            }
        }
    }
}

new Test_Library;

两者的结果print_r应该是一样的。

标签: phpoop

解决方案


您的问题是,粗略地说,对象是通过引用传递的。可以在文档中找到详细信息。

在您的第一个foreach循环中,您将引用分配$this->processes->data->3$this->operations->processes->3

        foreach($this->processes->data as $process) {
            $this->operations->processes->{$process->id} = $process;
        }

在下一个循环中,您将附加到刚刚建立的data属性$this->operations->processes->3作为对 $this->processes->data->3.

        foreach($this->tasks->data as $task) {
            $this->operations->processes->{$task->processes_id}->data[] = (object) [
                'machine' => [],
                'task' => $task
            ];
        }

要解决此问题,您可以尝试clone在第一个循环中的赋值期间使用运算符(有关更多详细信息,请参见此处)或简单地使用关联数组。


推荐阅读