$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
。我如何做到这一点,当我将一个变量赋值给一个对象的引用时,它会将它分配给对象本身?
编辑:我希望变量在对象更改时更改,因此无法按值进行克隆/复制。
答案 0 :(得分:0)
除了回应来自@IvoP和@ mega6382的评论之外,值得注意的是,你所遇到的问题本身并不是“可解决的”问题。那是因为你遇到的是对象如何在PHP中工作的基础。您可以在http://ca2.php.net/manual/en/language.oop5.references.php了解相关信息。
经常提到的PHP 5 OOP的一个关键点是“默认情况下通过引用传递对象”。这不完全正确。本节使用一些例子来纠正这种普遍的想法。
PHP引用是一个别名,它允许两个不同的变量 写入相同的值。从PHP 5开始,对象变量没有 将对象本身包含为值。它只包含一个对象 标识符,允许对象访问者查找实际对象。 当一个对象通过参数发送,返回或分配给另一个对象时 变量,不同的变量不是别名:它们持有副本 标识符,指向同一个对象。 (帽子提示@tomzx)
您可能最好重新构建代码以处理此问题,或者使用默认行为是按C或Java调用的语言。