如何在回调函数中访问外部的变量

在swoole_server/swoole_client的事件回调函数中,需要读取调用外部的变量和对象,可以通过下面的几种方法实现。

一、事件回调函数改用对象+属性

class Server
{
    public $buffer;
    public $serv;

    function onReceive($serv, $fd, $from_id, $data)
    {
        //在这里可以读取到EventCallback对象上的属性和方法
        $this->buffer[$fd] = $data;
        $this->hello();
    }

    function hello()
    {

    }

    function run()
    {
        $serv = new swoole_server('127.0.0.1', 9501);
        $this->serv  = $serv;
        $serv->on('receive', array($this, 'onReceive'));
        $serv->start();
    }
}

$server= new Server;
$server->run();

二、使用全局变量

$buffer = array();
$serv->on('receive', function($serv, $fd, $from_id, $data) {
    global $buffer;
    $buffer[$fd] = $data;
});

三、使用类静态变量

class Test
{
    static $buffer;
}

$serv->on('receive', function($serv, $fd, $from_id, $data) {
    Test::$buffer[$fd] = $data;
});

四、匿名函数中使用use语法

$buffer = array();
$serv->on('receive', function($serv, $fd, $from_id, $data) use ($buffer) {
    $buffer[$fd] = $data;
});

需要PHP5.4或更高的版本
多个参数可以用逗号隔开,如use ($buffer, $users, $config)

五、直接保存在swoole_server/swoole_client对象上

$serv->buffer = array();
$serv->on('receive', function($serv, $fd, $from_id, $data) use ($buffer) {
    $serv->buffer[$fd] = $data;
});

~



  • kankan

    必须要和$fd绑定吗?如果是全局对象呢?

  • 杨泽涛

    不和$fd绑定多个客户端请求的数据就都搞一块去了

  • 云山锅锅

    第五条很令人费解:1.$serv是否有buffer属性?如果class里面没有定义buffer属性,随时能像这样定义吗?2 use($buffer) 这个语句跟四一样,但是,$buffer没有单独定义。 如果以上都成立,说明$serv->访问的是serv进程堆,所以$serv->$buffer 和$buffer指的是同一个地址?如果是这样,就不应该用use($buffer),直接在内部用$serv->$buffer就可以直接访问了吧??

  • 杨泽涛

    class里面没有定义buffer属性,也可以随时添加buffer属性的啊,这是PHP常识啊哥,这个和swoole没有关系的

  • 携梦出征

    多谢,辛苦了

  • Sun_翁航

    其实是不会的,你在fd=1的时候绑定的数据,也只能在fd=1的时候访问到,在fd=2的时候是访问不到的

  • 朝阳

    $serv->defer(array('ReceiverDemo', 'deferCallBackFunc')); 这种回调函数怎么传递参数呀?

  • Godfrey

    第五点也表示看不懂use ($buffer)

  • ...

    请问我想要一个共享的全局变量,使用第一种方法发现数据不完整呀,有的可以获取到有的获取不到,请问怎么处理呀

  • ...

    好像是因为我升级了配置,将一个一核CPU升级到了双核。。好像变成了两个进程,有的用户进了另一个,就读取不到其他的数据了,请问怎么解决好啊? 十分感谢