php的事件处理机制(回调函数)

朱雀 2022-08-01 02:52 304阅读 0赞

起因

js有个事件处理机制,当事件被触发时,调用设置的回调函数。
比如说

  1. $("#div").on('click',function(){
  2. // 代码段
  3. });

那么身为世界上最好的语言,php能做到吗?
答案是肯定的,比如 swoole

  1. $serv = new swoole_server("127.0.0.1", 9501);
  2. $serv->set(array(
  3. 'worker_num' => 8, //工作进程数量
  4. 'daemonize' => true, //是否作为守护进程
  5. ));
  6. $serv->on('connect', function ($serv, $fd){
  7. echo "Client:Connect.\n";
  8. });
  9. $serv->on('receive', function ($serv, $fd, $from_id, $data) {
  10. $serv->send($fd, 'Swoole: '.$data);
  11. $serv->close($fd);
  12. });
  13. $serv->on('close', function ($serv, $fd) {
  14. echo "Client: Close.\n";
  15. });
  16. $serv->start();

再比如 Phalcon 的 RESET API

  1. $app = new Phalcon\Mvc\Micro();
  2. //Retrieves all robots
  3. $app->get('/api/robots', function() {
  4. });
  5. //Searches for robots with $name in their name
  6. $app->get('/api/robots/search/{name}', function($name) {
  7. });

and so on

开始

这种拿php当js用这麽帅气的事情,臣妾做不到啊。
俗话说 内事不决问百度,外事不决问谷哥,
然后度娘告诉了我这个 大神的博文

  1. PHP回调函数的实现方法

大神说了下原理,我想了想写了这麽个东西,

  1. class MyClass{
  2. public $eventMap = array();
  3. function on($evtname , $handle ){
  4. //注册一个事件上的响应回调函数
  5. $this->eventMap[$evtname]=$handle;
  6. }
  7. function trigger($evtname , $scope=null){
  8. //触发一个事件,也就是循环调用所有响应这个事件的回调函数
  9. call_user_func_array( $this->eventMap[$evtname] , $scope);
  10. }
  11. }

里面用了这么个东西 call_user_func_array 官网说明

大神在他的博客里说了三种类型函数的调用方法和传参方法,博客里提到 为了能使用对象的属性,用create_function创建函数,这点我觉得没有必要,如果是调用一个对象的方法,里面用到对象的属性,那么传参数直接将对象传递过来就好。

对此我再说一下 ,本来是这样的

  1. $func = array( '类名','类的方法名' );
  2. $args = array('参数1','参数2') ;
  3. call_user_func_array( $func , $args );

这里面的 $func 都是 字符串 , 当调用的方法里有$this这种东西时,回报错,
那么我建议是这样

  1. $func = array( $object ,'类的方法名' );
  2. $args = array('参数1','参数2') ;
  3. call_user_func_array( $func , $args );

这样就没问题了。
下面看看效果
先来个大众的

  1. $MyClass = new MyClass;
  2. $MyClass->on('post' , function($a , $b ){
  3. echo " a = $a ; \n ";
  4. echo " b = $b ; \n ";
  5. echo " a + b = ".( $a + $b) . ";\r\n ";
  6. } );
  7. $MyClass->trigger('post' , array( 123 , 321 ) );//框架内部触发

举个例子
我们希望根据http的不同请求调用不同的函数来处理;
比如说接收到了post请求,此时就调用post对应的注册函数。

然后是换个类的方法

  1. class test{
  2. static $static = "this is static ";
  3. public $nomal = "this is nomal ";
  4. function demo($a , $b ){
  5. echo " a = $a ;\r\n";
  6. echo " b = $b ;\r\n";
  7. echo " static = ".self::$static." ;\r\n";
  8. echo " nomal = ".$this->nomal." ;\r\n";
  9. echo " add = ".$this->add." ;\r\n";
  10. }
  11. }

接着来

  1. $test = new test;
  2. $test->add = " this is new add ";
  3. $MyClass->on('post' ,array( $test , 'demo' ) );
  4. $MyClass->trigger('post' , array( 123 , 321 ) );

ok , 没有问题。

其实我想到了另一件事情,
有个对象数组 $objects , 我们给每一个对象绑定各自的事件和事件的回调方案,
比如说,小偷来了,我们要打110;朋友来了,我们要请客吃饭。

我不知道实际的项目中有没有这种情景需要,并且暂时没想过怎么处理。

转自

php的事件处理机制(回调函数)

发表评论

表情:
评论列表 (有 0 条评论,304人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java函数机制理解

    模块之间总是存在这一定的接口,从调用方式上看,可以分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,也是我们在写程序中经常使用的;回调是一种双向的调用模式,也就是说