php - 对象被神秘地覆盖
问题描述
$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
应该是一样的。
解决方案
您的问题是,粗略地说,对象是通过引用传递的。可以在文档中找到详细信息。
在您的第一个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
在第一个循环中的赋值期间使用运算符(有关更多详细信息,请参见此处)或简单地使用关联数组。
推荐阅读
- arduino - 无法将程序上传到 ESP8266
- html - 将 div 居中在 2 个 div 上的 CSS 指南
- python - python instance() 或 type() 无法得到正确的结果
- ios - 删除 UIBezierPath 上的额外空间
- angular - 错误 无法加载 PDF 文档。(角5)
- java - 代码给出 -1 而不是 4。方法应该返回一个值
- c# - 以编程方式合并几何,同时保持每个形状的单独位置?
- javascript - 如何从json打印精确的html标签
- java - 哪一个更好地传递给 StringBuilder.append?
- android - 我想将 imageview 标签与 imageview backgroundresource 进行比较?