在php中跨类共享一个对象数组

时间:2016-06-09 09:19:55

标签: php multithreading design-patterns pass-by-reference ratchet

我有一个场景,其中必须由其他类的对象读取和修改对象数组(玩家)。这些对象将在同一个数组上工作,也就是说,所有对象都可以看到对数组的任何更改。任何东西都可能修改数组,包括线程和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);
        }
    }

}

WorldConnectionClass中的$玩家应始终保持一致!!

ConnectionInterfaceMessageComponentInterface属于" Ratchet"我正在使用的Web-Socket库。此外,如果它有任何区别,每个类都在自己的.php文件中。

我应该如何构建代码?

我应该在Player类本身中使共享数组静态吗?如果是这样,如何从其他类访问它?

我尝试的事情:

注意:我知道对阵列的多线程访问需要特殊的措施和同步(请详细说明),但主要问题是如何跨类共享阵列(不是必然线程)

1 个答案:

答案 0 :(得分:0)

如果WorldConnectionClass扩展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