资讯专栏INFORMATION COLUMN

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

Forelax / 676人阅读

摘要:起因有个事件处理机制,当事件被触发时,调用设置的回调函数。其实我想到了另一件事情,有个对象数组,我们给每一个对象绑定各自的事件和事件的回调方案,比如说,小偷来了,我们要打朋友来了,我们要请客吃饭。

起因

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

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

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

$serv = new swoole_server("127.0.0.1", 9501);
$serv->set(array(
    "worker_num" => 8,   //工作进程数量
    "daemonize" => true, //是否作为守护进程
));
$serv->on("connect", function ($serv, $fd){
    echo "Client:Connect.
";
});
$serv->on("receive", function ($serv, $fd, $from_id, $data) {
    $serv->send($fd, "Swoole: ".$data);
    $serv->close($fd);
});
$serv->on("close", function ($serv, $fd) {
    echo "Client: Close.
";
});
$serv->start();

再比如 Phalcon 的 RESET API


$app = new PhalconMvcMicro(); //Retrieves all robots $app->get("/api/robots", function() { }); //Searches for robots with $name in their name $app->get("/api/robots/search/{name}", function($name) { });

and so on

开始

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

  

PHP回调函数的实现方法

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

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

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

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

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

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

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

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

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


$MyClass = new MyClass; $MyClass->on("post" , function($a , $b ){ echo " a = $a ; "; echo " b = $b ; "; echo " a + b = ".( $a + $b) . "; "; } ); $MyClass->trigger("post" , array( 123 , 321 ) );//框架内部触发

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


然后是换个类的方法

class test{
    static $static = "this is  static ";
    public $nomal = "this is nomal ";
    function demo($a , $b ){
        echo " a = $a ;
";
        echo " b = $b ;
";
        echo " static = ".self::$static." ;
";
        echo " nomal = ".$this->nomal." ;
";
        echo " add = ".$this->add." ;
";
    }
}

接着来

$test = new test;
$test->add = " this is new add ";
$MyClass->on("post" ,array( $test , "demo" ) );
$MyClass->trigger("post" , array( 123 , 321 )  );

ok , 没有问题。


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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20980.html

相关文章

  • 来,告诉你Node.js究竟是什么?

    摘要:当某个执行完毕时,将以事件的形式通知执行操作的线程,线程执行这个事件的回调函数。为了处理异步,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理。另外,单线程带来的好处,操作系统完全不再有线程创建销毁的时间开销。 前言 如果你有一定的前端基础,比如 HTML、CSS、JavaScript、jQuery;那么,Node.js 能让你以最低的成本快速过渡成为一个全栈工程师(我称...

    Jonathan Shieber 评论0 收藏0
  • Node_模块

    摘要:当某个执行完毕时,将以时间的形式通知执行操作的线程,线程执行了这个事件的回调函数。为了处理异步,线程必须有事件循环,不断的检查是否有未处理的时间。这种处理机制,称为事件环机制。方面使用第三方模块。 简介 V8引擎本身就是用于Chrome浏览器的JS解释部分,但是Ryan Dahl,把V8搬到服务器,用于做服务器的软件。Node是一个专注于实现高性能Web服务器优化的专家,在遇到V8而诞...

    zero 评论0 收藏0
  • swoole入门4-初识swoole

    摘要:当某种网络事件发生时,会回调用户设置的指定回调函数。承担了底层网络事件的监听及各种底层事件处理,当收到请求时,会触发事件提醒,然后将控制权转交预先注册的事件回调函数,来进行后续的处理。请求到来时创建,请求结束后销毁。 运行流程图 showImg(https://segmentfault.com/img/remote/1460000017207791);showImg(https://s...

    forsigner 评论0 收藏0
  • Node.js运行原理、高并发性能测试对比及生态圈汇总

    摘要:模式,单实例多进程,常用于多语言混编,比如等,不支持端口复用,需要自己做应用的端口分配和负载均衡的子进程业务代码。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。 showImg(https://segmentfault.com/img/remote/1460000019425391?w=1440&h=1080); Nod...

    kamushin233 评论0 收藏0

发表评论

0条评论

Forelax

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<