2017-10-15 71 views
0
$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中间件做$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

您错过了将这些$实体放入函数的方法。你也错过了回报。你可以使用'global $ a,$ b;'或者将参数设置为'do_some_stuff($ a,$ b)来执行'function setupt(&$ objectA,&$ objectB)'或者''entities''' –

+0

。 '。 – mega6382

回答

0

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

经常提到的PHP 5 OOP的一个关键点是“对象通过默认引用传递”。这并不完全正确。本节使用一些例子来整理这个一般思想。

PHP引用是一个别名,它允许两个不同的变量 写入相同的值。从PHP 5起,一个对象变量不包含对象本身作为值的 。它只包含一个对象 标识符,它允许对象访问器查找实际对象。 当一个对象被自变量发送,返回或分配给另一个变量时,这些不同的变量不是别名:它们持有 指向同一对象的标识符副本。 (帽尖到@tomzx)

你可能会做的更好,以重新构建你的代码来处理这个,或者使用其默认行为是一种语言调用 - 值如C或Java。

相关问题