在Class中将Class对象创建为PHP中的数组var

时间:2014-07-21 12:03:16

标签: php arrays class object

我正在尝试将新的PHP对象添加到类中的数组中。它适用于2个条目,但是在添加1个之后,整个数组都被破坏了。

public $players = array();

这是我添加新PHP对象的代码:

    /*
     * $data[0] => GameUserID
     * $data[1] => SlotID (In Game, INT)
     * $data[2] => GameUserName
     * $this => I've made a function called log($str) in the Main class, so I can
     * class this Function in the Player Class later
    */
    $this->log("Creating new player on SlotID #".$data[1]);
    $tmp = new Player($data[0], $data[2], $this);
    $this->players[$data[1]] = &$tmp;
    unset($tmp);

    //$this->players[$data[1]] = new Player($data[0], $data[2], $this);

Class“Player”不会在__construct()上返回任何内容。

我找不到我做的失败。

==============

我发现在调用函数(到达结尾)后变量没有保存。每当我再次调用该函数时它再次为空。

2 个答案:

答案 0 :(得分:0)

您正在将对象传递给数组,但是您在指向该对象的变量上调用unset()。请注意both variables point to the same object(即使您遗漏了&运营商),请移除您对unset()的通话。

如果您愿意,还可以立即将对象分配给您的数组:

 $this->players[$data[1]] = new Player($data[0], $data[2], $this);

这样,您就没有$tmp变量了。在我看来,代码并不难理解 - 恰恰相反,$tmp并没有真正表达出来。


此外,我不确定$data[1]来自哪里或它持有什么。如果您仍然遇到问题,请在开发过程中输出所有错误,方法是将error_reporting(E_ALL)放在文件顶部。这可以为出现问题提供一些非常有价值的见解。

答案 1 :(得分:0)

从评论中可以清楚地看出,OP在$data[1]元素中只有两个值(状态)。我们称他们为State OneState Two

这可能导致

$this->players[State One] = new Player($data[0], $data[2], $this);
$this->players[State One] = new Player($data[0], $data[2], $this);
$this->players[State One] = new Player($data[0], $data[2], $this);
$this->players[State Two] = new Player($data[0], $data[2], $this);
$this->players[State Two] = new Player($data[0], $data[2], $this);
$this->players[State Two] = new Player($data[0], $data[2], $this);

这将导致数组中只有2个元素,因为每个State One会覆盖前一个元素,而每个State Two会使用相同的键覆盖前一个元素。

在这种情况下,解决方案要么为每个状态创建两个属性并填充它们,要么创建一个多维数组:

if ($data[1] === 'State One') {
    $this->playersFromStateOne[] = new Player($data[0], $data[2], $this);
} else {
    $this->playersFromStateTwo[] = new Player($data[0], $data[2], $this);
}

$this->players[$data[1]][] = new Player($data[0], $data[2], $this);