我正在尝试将新的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()上返回任何内容。
我找不到我做的失败。
==============
我发现在调用函数(到达结尾)后变量没有保存。每当我再次调用该函数时它再次为空。
答案 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 One
和State 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);