如何为对象分配变量,而不是对它的引用?

时间:2017-10-15 14:22:53

标签: php arrays oop variables reference

$a = some object;
$b = another object;
function do_some_stuff() {
    $c = $a;
    $b->a_property = $c;
}
do_some_stuff();
echo $b->a_property; # Undefined, becuase $c was deleted when the function exited.

当我输入$b->a_property = $c时,我希望PHP interpereter执行$b->a_property = $a。如果我无法直接将其分配给$a,我该怎么做?

我的实际代码是:

function setup() {
    $playerHeroes = [];
    $enemyHeroes = [];
    foreach ($entities as $object) {
        if ($object->team == "player") {
            $playerHeroes[] = $object;
        }
        else if ($object->team == "enemy") {
            $enemyHeroes[] = $object;
        }
    }

    foreach ($playerHeroes as $object) {
        $object->target = $enemyHeroes[array_rand($enemyHeroes)];
    }
    foreach ($enemyHeroes as $object) {
        $object->target = $playerHeroes[array_rand($playerHeroes)];
    }
}

我将游戏中的实体列表排序为在玩家的团队中或者在敌人的团队中。每个英雄必须瞄准对方球队的英雄。当setup功能退出时,$object$playerHeroes$enemyHeroes会被销毁。稍后会访问->target属性,它是null。我如何做到这一点,当我将一个变量赋值给一个对象的引用时,它会将它分配给对象本身?

编辑:我希望变量在对象更改时更改,因此无法按值进行克隆/复制。

1 个答案:

答案 0 :(得分:0)

除了回应来自@IvoP和@ mega6382的评论之外,值得注意的是,你所遇到的问题本身并不是“可解决的”问题。那是因为你遇到的是对象如何在PHP中工作的基础。您可以在http://ca2.php.net/manual/en/language.oop5.references.php了解相关信息。

  

经常提到的PHP 5 OOP的一个关键点是“默认情况下通过引用传递对象”。这不完全正确。本节使用一些例子来纠正这种普遍的想法。

     

PHP引用是一个别名,它允许两个不同的变量   写入相同的值。从PHP 5开始,对象变量没有   将对象本身包含为值。它只包含一个对象   标识符,允许对象访问者查找实际对象。   当一个对象通过参数发送,返回或分配给另一个对象时   变量,不同的变量不是别名:它们持有副本   标识符,指向同一个对象。   (帽子提示@tomzx)

您可能最好重新构建代码以处理此问题,或者使用默认行为是按C或Java调用的语言。