我正在使用HTML5 WebSockets进行一个项目,使用一个使用websockets库的PHP服务器here at Github.
我的项目还取决于知道有多少玩家在线。该库有三种抽象方法,connected
,closed
和process
。在connected
和closed
中,它采用参数$user
,这是一个自定义类,其中包含随机字母数字字符串作为变量id
。
我的班级开头有一个protected $users = [];
,在我的班级里面,它扩展了图书馆提供的WebSocketServer。在我的connected
方法中,我array_push
$user
提供给$users
数组。然后,在我的closed
方法中,我遍历$users
数组,检查$users
中的元素是否与提供的$id
具有相同的$user
,并且然后array_splicing
如果那是尝试那个元素。
所以。这是我的问题。当我以root身份运行我的PvPASCIIServer.php,并使用测试网页连接时,一切正常。但是,当我断开连接时,它说:
PHP Warning: array_splice() expects parameter 1 to be array, null given in /var/www/PvPASCII/PvPASCIIServer.php on line 24
不应array()
不将$users
初始化为null吗?为什么会这样?我也尝试使用初始化数组的文字格式[]
,但即使这样也行不通。甚至更凶悍,我的array_push
函数开头的connected
没有返回错误消息。逻辑上,它应该工作并将$user
推送到$users
数组的末尾,因此即使它被初始化为null,它之后也不应该为null。
我的代码,如果你需要它:
#!/usr/local/bin/php
<?
require_once("websockets.php");
class PvPASCIIServer extends WebSocketServer
{
protected $users = [];
protected function connected($user)
{
$this->send($user, "say Pong!");
array_push($this->users, $user);
echo $user->id;
return true;
}
protected function closed($user)
{
echo "Client " + $user->id + " disconnected from the server.";
for($i = 0; $i < sizeof($this->users); $i++)
{
if($this->users[$i]->id == $user->id)
{
array_splice($users, $i, 1); // <-- Line with the error
}
}
}
protected function process($user, $message)
{
// Yet to be determined.
}
}
$host = "localhost";
$port = 3000;
$server = new PvPASCIIServer($host, $port);
$server->run();
?>
答案 0 :(得分:4)
$users
需要$this->users
,就像你班上其他地方一样:
if($this->users[$i]->id == $user->id)
{
array_splice($this->users, $i, 1); // <-- Line with the error
}
答案 1 :(得分:2)
array_splice($users, $i, 1); // <-- Line with the error
应该是:
array_splice($this->users, $i, 1); // <-- Line with the error
因为你想使用类变量$ users而不是函数变量$ users
编辑:
约翰康德也说了什么(他打字的速度要快一点;-))