我有一个场景,其中必须由其他类的对象读取和修改对象数组(玩家)。这些对象将在同一个数组上工作,也就是说,所有对象都可以看到对数组的任何更改。任何东西都可能修改数组,包括线程和IO事件函数。
以下是具体细节:
class Player {
public $connection;
public $x,$y,$velocity;
public function __construct(ConnectionInterface $conn, $initx, $inity)
{ /* ... */ }
public function updateVelocity($newVelocity) { /* ... */ }
}
$players_arr = array();
class ConnectionClass extends Thread implements MessageComponentInterface {
private $players;
// A new player connected
public function onOpen(ConnectionInterface $conn) {
// ...
array_push($this->players, new Player($conn, x, y);
}
public function run() {
while(true) {
// ...
foreach ($this->players as $player)
$player->connection->send(data);
sleep(1);
}
}
}
class World extends Thread {
private $players;
public function run() {
while(true) {
// ...
foreach ($this->players as $player)
$player->updateVelocity($vel);
usleep(30000);
}
}
}
World
和ConnectionClass
中的$玩家应始终保持一致!!
ConnectionInterface
和MessageComponentInterface
属于" Ratchet"我正在使用的Web-Socket库。此外,如果它有任何区别,每个类都在自己的.php文件中。
我应该如何构建代码?
我应该在Player
类本身中使共享数组静态吗?如果是这样,如何从其他类访问它?
我尝试的事情:
$players_arr
的引用传递给类'构造函数并将其分配给$players
:出现cannot assign by reference to overloaded object
错误。
http://ubuntuforums.org/showthread.php?t=2082788 ArrayObject
:在new Player()
中向onOpen()
添加Tab
并不会产生任何影响。 (可能做错了吗?)
Sharing array inside object through classes in php 注意:我知道对阵列的多线程访问需要特殊的措施和同步(请详细说明),但主要问题是如何跨类共享阵列(不是必然线程)
答案 0 :(得分:0)
如果World
和ConnectionClass
扩展Thread
课程的目的是分享相同的$玩家,那么这项工作就无法实现。
至于我可以解决您的问题ArrayObject
的新实例应该完成这项工作,您只需将它的实例传递给World
&{39}和{{ 1}}' s实例:
ConnectionClass
您应该更改$players = new ArrayObject();
$connection = new ConnectionClass($players); //add it to the other arguments if any
$world = new World($players); //add it to the other arguments if any
//or you can with setter
$players = new ArrayObject();
$connection = new ConnectionClass();
$connection->setPlayers($players);
$world = new World($players);
$world-> setPlayers($players);
和World
的控制器以使用新参数启动ConnectionClass
属性,或者实现设置器。
private $players
您还应该更改public function __construct($players)
{
$this->players = $players;
}
//or
public function setPlayers($players)
{
$this->players = $players;
}
的实施:
onOpen