Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop - Fatal编程技术网

Php 对象被神秘地覆盖

Php 对象被神秘地覆盖,php,oop,Php,Oop,不知何故,$this->processs->data每次调用$this->load_operations()时都会展开。当我的代码显然没有修改对象时,我真的不明白为什么该对象会更改 我错过什么了吗 如果我将$process(在foreach中)强制转换为数组,然后返回到对象$this->processs->data,则不会展开 $process = (array) $process; $process = (object) $process; 类测试库 { 私人程序; 私人任务; 私人业务;

不知何故,
$this->processs->data
每次调用
$this->load_operations()
时都会展开。当我的代码显然没有修改对象时,我真的不明白为什么该对象会更改

我错过什么了吗

如果我将
$process
(在foreach中)强制转换为数组,然后返回到对象
$this->processs->data
,则不会展开

$process = (array) $process;
$process = (object) $process;
类测试库
{
私人程序;
私人任务;
私人业务;
公共函数构造()
{
$this->处理=(对象)数组(
“数据”=>(对象)数组(
“3”=>(对象)数组(
'id'=>'3',
)
)
);
$this->tasks=(对象)数组(
“数据”=>(对象)数组(
“5”=>(对象)数组(
'id'=>'5',
'进程_id'=>'3',
),
“6”=>(对象)数组(
'id'=>'6',
'进程_id'=>'3',
)
)
);
$this->operations=(对象)数组(
“进程”=>(对象)数组(
“3”=>(对象)数组(
'id'=>'3',
'data'=>array()
)
)
);
打印($this->processs->data);
$this->load_operations();
打印($this->processs->data);
}
私有函数加载_操作()
{
如果(!empty($this->processs->data))
{
foreach($this->processs->data as$process)
{
$this->operations->processs->{$process->id}=$process;
}
}
如果(!empty($this->tasks->data))
{
foreach($this->tasks->data as$task)
{
$this->operations->processs->{$task->processs_id}->data[]=(对象)[
“机器”=>[],
“任务”=>$task
];
}
}
}
}
新的测试库;

两个
打印的结果应该是相同的。

您的问题是,粗略地说,对象是通过引用传递的。详情请参阅

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

        foreach($this->processes->data as $process) {
            $this->operations->processes->{$process->id} = $process;
        }
在下一个循环中,您将附加到
$this->operations->processs->3的
data
属性,该属性是您刚刚建立的对
$this->processs->data->3
的引用

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

为了避免这种行为,您可以在第一个循环的赋值过程中尝试使用
clone
操作符(了解更多详细信息),或者简单地使用关联数组。

请学习堆栈溢出的工作原理,并阅读如何提高问题的质量。然后,你的问题是包括你的全部源代码,这些代码可以被其他人测试。@Progman在我看来,这是一个很好的例子。唯一缺少的是我添加的对象的实例化。谢谢@miken32。添加
$process\u clone=clone$process到第一个foreach解决了我的问题。