【问题标题】:How do I assign a variable to an object, not a reference to it?如何将变量分配给对象,而不是对它的引用?
【发布时间】:2017-10-15 14:22:53
【问题描述】:
$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。如何做到这一点,以便当我将变量分配给对象的引用时,它会将其分配给对象本身?

编辑:我希望变量在对象更改时更改,因此按值克隆/复制不是一种选择。

 

【问题讨论】:

  • 您缺少将这些 $entities 放入您的函数的方法。你也错过了回报。你可以用function setupt(&$objectA, &$objectB) 或类似的东西$entities
  • 要么使用global $a,$b;,要么设置参数为do_some_stuff($a,$b)

标签: php arrays oop variables reference


【解决方案1】:

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

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

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

您可能会更好地重新构建您的代码来处理这个问题,或者使用默认行为是按值调用的语言,如 C 或 Java。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 2018-10-26
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多