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解决了我的问题。