我在一个对象中有一个静态函数,它执行一些操作并返回一个像这样的对象:
$objectA = ObjectA::getItem();
然后我有一个函数生成其他类型的对象并返回它们的数组,这些类型的对象的一部分需要$objectA
,所以它会像这样传入:
$arrayOfObjectB = ObjectB::getStuff($objectA);
构建$arrayOfObjectB
时,我会更改$objectA
的{{1}}的一部分。
这样的事情:
$objectB
所发生的事情是public static function getStuff($objectA)
{
$arrayOfObjectB = array();
foreach(...loops through some stuff)
{
$objectA->setSomething($variableChangedDuringLoop);
$objectB = new ObjectB($objectA);
$arrayOfObjectB[] = $objectB;
}
}
中的所有$objectA->something
都设置为与循环中的最后一项相同的东西,我想要发生的是$arrayOfObjectB
在循环期间保持设置单独的值。
我可以在循环期间每次克隆对象然后设置它们,这将起作用。 但这种做法似乎是错误的。
答案 0 :(得分:1)
将$objectA
的引用传递给函数或构造函数时,不会生成对象的副本。如果对$objectA
进行修改,则会影响与函数(或构造函数)外部存在的对象相同的实例。如果需要独立实例,则需要复制该对象。像这样:
public static function getStuff($objectA)
{
$arrayOfObjectB = array();
foreach(...loops through some stuff)
{
// make a copy of $objectA
$objectAClone = new ObjectA();
$objectAClone->setX($objectA->getX());
$objectAClone->setY($objectA->getY());
...
$objectAClone->setSomething($variableChangedDuringLoop);
$objectB = new ObjectB($objectAClone);
$arrayOfObjectB[] = $objectB;
}
}
答案 1 :(得分:0)
要做你想做的事,你需要克隆你的对象。如果感觉不对,那可能是因为你想要做的事情并不是真的正确。
我可以提出一个更好的解决方案,但我需要知道你在用这些值做些什么。