× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

4种PHP回调函数风格

匿名函数

$server->on('Request', function ($req, $resp) use ($a, $b, $c) {
    echo "hello world";
});

可使用use向匿名函数传递参数

类静态方法

class A
{
    static function test($req, $resp)
    {
        echo "hello world";
    }
}
$server->on('Request', 'A::Test');
$server->on('Request', array('A', 'Test'));

对应的静态方法必须为public

函数

function my_onRequest($req, $resp)
{
    echo "hello world";
}
$server->on('Request', 'my_onRequest');

对象方法

class A
{
    function test($req, $resp)
    {
        echo "hello world";
    }
}

$object = new A();
$server->on('Request', array($object, 'test'));

对应的方法必须为public


  • CoderKing

    请问,在类的内部实例化了一个异步client对象,设置这个client对应的回调函数时是不能使用当前类内部的函数吗? class A{ function a(){ $server->onConnect($this,"b"); } function b(){ } } 类似这样的例子!希望我的表达大家能够理解

  • CoderKing

    sorry,可以这么写,代码写错了,忘记把$this和"b"放在array里面,当成2个参数传进去了!

  • 吴迪

    还可以 用单冒号: 调用非静态方法 $server->on('Request', 'A:Test');

  • 他的流年

    请问怎么传一个参数过去呢

  • 飞呀肥猫

    请问调用对象方法的时候传参是怎么传的呢?

  • ilbebk

    总结得很好啊,就是对zend_API.C里面zend_is_callable_ex函数里几个分支的说明

  • 轩

    可以的 class A{ function __construct() { $serv = new swoole_server("127.0.0.1", 9501);

        //监听连接进入事件
        $serv->on('connect', function ($serv, $fd) {  
            echo "Client: Connect.\n";
        });
    
        //监听数据接收事件
    

    // $serv->on('receive', function ($serv, $fd, $from_id, $data) { // echo "server: receive.\n"; // $serv->send($fd, "Server: ".$data); // }); //监听数据接收事件 $serv->on('receive', array($this, 'b'));

        //监听连接关闭事件
        $serv->on('close', function ($serv, $fd) {
            echo "Client: Close.\n";
        });
        //启动服务器
        $serv->start(); 
    }
    
    function b($serv, $fd, $from_id, $data){
         echo "server: receive.\n";
        $serv->send($fd, "Server: ".$data);
    }
    

    } new A();