将对象传递给php中的函数

时间:2016-11-29 17:27:21

标签: php oop

我在一个对象中有一个静态函数,它执行一些操作并返回一个像这样的对象:

$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在循环期间保持设置单独的值。

我可以在循环期间每次克隆对象然后设置它们,这将起作用。 但这种做法似乎是错误的。

2 个答案:

答案 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)

要做你想做的事,你需要克隆你的对象。如果感觉不对,那可能是因为你想要做的事情并不是真的正确。

我可以提出一个更好的解决方案,但我需要知道你在用这些值做些什么。