【发布时间】:2016-06-09 09:19:54
【问题描述】:
我有一个场景,其中一组对象(玩家)必须由其他类的对象读取和修改。这些对象将作用于同一个数组,也就是说,对数组的任何更改都会被所有对象看到。任何东西都可能修改数组,包括线程和 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 中的$players 应该始终相同!!
ConnectionInterface 和 MessageComponentInterface 是我正在使用的 Web-Socket 库“Ratchet”的一部分。此外,如果有任何区别,每个类都在其自己的 .php 文件中。
我应该如何构建代码?
我应该在Player 类本身中将共享数组设为静态吗?如果是,如何从其他类访问它?
我尝试过的事情:
- 将
$players_arr的引用传递给类的构造函数并将其分配给$players:得到cannot assign by reference to overloaded object错误。 http://ubuntuforums.org/showthread.php?t=2082788 - 使用
ArrayObject:在onOpen()中添加new Player()不会产生任何效果。 (可能做错了吗?) Sharing array inside object through classes in php
注意:我知道多线程访问数组需要特殊措施和同步(请详细说明),但主要问题是如何跨类共享数组(不一定是线程)
【问题讨论】:
标签: php multithreading design-patterns pass-by-reference ratchet