【发布时间】:2018-12-03 13:15:32
【问题描述】:
我在一个类中有一个方法可以从一个数组中复制一个对象并将其放入另一个数组中,我使用克隆来避免修改原始对象的可能性。这是代码:
class I {
public $name;
public $value;
public function __construct( $name, $value )
{
$this->name = $name;
$this->value = $value;
}
}
class D {
public $name;
public $items;
public function __construct( $name )
{
$this->name = $name;
$this->items = array(
'I1' => new I( "I1", 1232 ),
'I2' => new I( "I2", 12 ),
'I3' => new I( "I3", "hello" )
);
}
public function addItem( Item $item )
{
array_push( $this->items, $item );
}
}
class B {
public $values;
public function __construct()
{
$this->values = array(
"D1" => new D("D1"),
"D2" => new D("D2"),
"D3" => new D("D3"));
}
}
class A {
public $name;
public $bobject;
public $finals;
public function __construct()
{
$this->bobject = new B();
$this->finals = array();
}
public function addFinal( $name )
{
$final = clone $this->bobject->values[$name];
array_push( $this->finals, $final );
}
}
class C extends A {
}
$c = new C();
$c->addFinal( "D1" );
$c->addFinal( "D1" );
$c->addFinal( "D1" );
$c->addFinal( "D1" );
$c->addFinal( "D2" );
$c->addFinal( "D3" );
$c->addFinal( "D1" );
$c->finals[0]->name = "HelloWorld";
$c->finals[0]->items["I1"]->name="ONLY_MODIFY_THIS";
print_r( $c );
exit;
如果你执行它,你会得到这个:
genial\C Object
(
[name] =>
[bobject] => genial\B Object
(
[values] => Array
(
[D1] => genial\D Object
(
[name] => D1
[items] => Array
(
[I1] => genial\I Object
(
[name] => ONLY_MODIFY_THIS
[value] => 1232
)
[I2] => genial\I Object
(
[name] => I2
[value] => 12
)
[I3] => genial\I Object
(
[name] => I3
[value] => hello
)
)
)
[D2] => genial\D Object
(
[name] => D2
[items] => Array
(
[I1] => genial\I Object
(
[name] => I1
[value] => 1232
)
[I2] => genial\I Object
(
[name] => I2
[value] => 12
)
[I3] => genial\I Object
(
[name] => I3
[value] => hello
)
)
)
[D3] => genial\D Object
(
[name] => D3
[items] => Array
(
[I1] => genial\I Object
(
[name] => I1
[value] => 1232
)
[I2] => genial\I Object
(
[name] => I2
[value] => 12
)
[I3] => genial\I Object
(
[name] => I3
[value] => hello
)
)
)
)
)
[finals] => Array
(
[0] => genial\D Object
(
[name] => HelloWorld
[items] => Array
(
[I1] => genial\I Object
(
[name] => ONLY_MODIFY_THIS
[value] => 1232
)
[I2] => genial\I Object
(
[name] => I2
[value] => 12
)
[I3] => genial\I Object
(
[name] => I3
[value] => hello
)
)
)
[1] => genial\D Object
(
[name] => D1
[items] => Array
(
[I1] => genial\I Object
(
[name] => ONLY_MODIFY_THIS
[value] => 1232
)
[I2] => genial\I Object
(
[name] => I2
[value] => 12
)
[I3] => genial\I Object
(
[name] => I3
[value] => hello
)
)
)
[2] => genial\D Object
(
[name] => D1
[items] => Array
(
[I1] => genial\I Object
(
[name] => ONLY_MODIFY_THIS
[value] => 1232
)
[I2] => genial\I Object
(
[name] => I2
[value] => 12
)
[I3] => genial\I Object
(
[name] => I3
[value] => hello
)
)
)
[3] => genial\D Object
(
[name] => D1
[items] => Array
(
[I1] => genial\I Object
(
[name] => ONLY_MODIFY_THIS
[value] => 1232
)
[I2] => genial\I Object
(
[name] => I2
[value] => 12
)
[I3] => genial\I Object
(
[name] => I3
[value] => hello
)
)
)
[4] => genial\D Object
(
[name] => D2
[items] => Array
(
[I1] => genial\I Object
(
[name] => I1
[value] => 1232
)
[I2] => genial\I Object
(
[name] => I2
[value] => 12
)
[I3] => genial\I Object
(
[name] => I3
[value] => hello
)
)
)
[5] => genial\D Object
(
[name] => D3
[items] => Array
(
[I1] => genial\I Object
(
[name] => I1
[value] => 1232
)
[I2] => genial\I Object
(
[name] => I2
[value] => 12
)
[I3] => genial\I Object
(
[name] => I3
[value] => hello
)
)
)
[6] => genial\D Object
(
[name] => D1
[items] => Array
(
[I1] => genial\I Object
(
[name] => ONLY_MODIFY_THIS
[value] => 1232
)
[I2] => genial\I Object
(
[name] => I2
[value] => 12
)
[I3] => genial\I Object
(
[name] => I3
[value] => hello
)
)
)
)
)
修改“ONLY_MODIFY_THIS”会影响几个对象,而应该只影响第一个对象。
我想要两件事:
保留原始对象 D1、D2 和 D3
仅修改 finals 数组中索引的对象。
【问题讨论】:
-
why its not working as spected我认为你没有提到你期望它做什么,它没有做什么? -
@JonStirling 我修改了代码,你理解我的问题,我相信内部数组有问题..
-
老实说,TL;DR。如果您可以将该代码简化为演示问题所需的最小示例,这将很有帮助。
-
@deceze 原来的代码很小而且在最上面,下面的代码是对象$c的print_r
-
这仍然是 5 个类来包装一个人。一定有一个比这更简单的例子。
标签: php class copy clone copy-constructor