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

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

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

  1. class Server
  2. {
  3. public $buffer;
  4. public $serv;
  5. function onReceive($serv, $fd, $from_id, $data)
  6. {
  7. //在这里可以读取到EventCallback对象上的属性和方法
  8. $this->buffer[$fd] = $data;
  9. $this->hello();
  10. }
  11. function hello()
  12. {
  13. }
  14. function run()
  15. {
  16. $serv = new swoole_server('127.0.0.1', 9501);
  17. $this->serv = $serv;
  18. $serv->on('receive', array($this, 'onReceive'));
  19. $serv->start();
  20. }
  21. }
  22. $server= new Server;
  23. $server->run();

二、使用全局变量

  1. $buffer = array();
  2. $serv->on('receive', function($serv, $fd, $from_id, $data) {
  3. global $buffer;
  4. $buffer[$fd] = $data;
  5. });

三、使用类静态变量

  1. class Test
  2. {
  3. static $buffer;
  4. }
  5. $serv->on('receive', function($serv, $fd, $from_id, $data) {
  6. Test::$buffer[$fd] = $data;
  7. });

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

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

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

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

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