最近一直在学习swoole的一些知识,手册大致浏览了一遍,但是收获不大,很多东西都记不住,于是决定还是做下学习笔记加深印象。关于回调相信做过开发的小伙伴都不会太陌生,举个很简单的例子:比如我们做的一些支付功能往往需要客户端设置一个回调地址,等待支付成功后服务端就会将支付的结果写到这个回调地址上来,然后客户端就知道支付的结果了。不过下面要说的回调和这个是有区别的,但是相同的是:都是当某个事件发生就会触发绑定好的事件执行,下面来介绍下四种设置回调函数的方式。
1. 匿名函数
匿名函数可以简单的理解为没有设置名字的函数,示例:
$a = $b = $c = 1;
$server->on('Request',function($reg,$resp) use ($a,$b,$c){
echo 'hello,world';
})
外部传入的参数可以放在function()里面传入,例如:$reg
,$resp
,也可以放到use()里面传入,如果在匿名函数里面修改这三个参数是不会影响外面对应的变量值。下面来举个简单的例子验证下:
<?php
$a = 1;
$func = function() use($a) {
$a = 2;
};
$func($a);
echo $a;
输出结果:1
2. 类静态方法
静态方法:static 修饰的方法
class A {
static function test($req,$resp){
echo 'hello world';
}
}
$server->on('Request','A::Test');
$server->on('Request',array('A','Test'));
将静态方法test作为Request方法的回调函数,也就是当请求成功后会执行test方法。这里的第二种方法是传入一个数组形式的,这种方式比较少见,暂时先记下来吧。不过需要注意的是静态方法test必须为public,这个也很好理解如果不是public的访问权限的话,类的外部是不能访问的。
3. 函数
func my_onRequest($req,$resp){
echo 'hello world';
}
$server->on('Request','my_onRequest');
这个可以和匿名函数的区别就是:回调函数单独提出来了。记忆的时候可以和匿名函数一起记忆。
4. 对象方法
class A
{
function test($req, $resp)
{
echo "hello world";
}
}
$object = new A();
$server->on('Request', array($object, 'test'));
test方法也必须为public,这个可以和静态方法放在一起记忆。上面这段代码是摘自swoole官方文档,不过笔者觉得在设置回调的时候还可以这么写:$server
->on('Request', $object
->test(); 为了验证笔者的猜想,下面写个例子测试下:
class A
{
function test($req, $resp)
{
echo "hello world";
}
}
$object = new A();
$http = new Swoole\Http\Server("127.0.0.1", 9501);
$http->on('request', $obj->test);
$http->start();
输出结果:PHP Fatal error: Uncaught TypeError: Argument 2 passed to Swoole\Server::on() must be callable, null given in /srv/swoole/course_code/04/test01.php:28
Stack trace
所以不能这么写
总结一下:这四种方法可以按照自己的习惯来写吧,不过匿名函数这种方式目前最常用的一种方式吧。
网友评论