摘要:起因有个事件处理机制,当事件被触发时,调用设置的回调函数。其实我想到了另一件事情,有个对象数组,我们给每一个对象绑定各自的事件和事件的回调方案,比如说,小偷来了,我们要打朋友来了,我们要请客吃饭。
起因
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
摘要:当某个执行完毕时,将以事件的形式通知执行操作的线程,线程执行这个事件的回调函数。为了处理异步,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理。另外,单线程带来的好处,操作系统完全不再有线程创建销毁的时间开销。 前言 如果你有一定的前端基础,比如 HTML、CSS、JavaScript、jQuery;那么,Node.js 能让你以最低的成本快速过渡成为一个全栈工程师(我称...
摘要:当某种网络事件发生时,会回调用户设置的指定回调函数。承担了底层网络事件的监听及各种底层事件处理,当收到请求时,会触发事件提醒,然后将控制权转交预先注册的事件回调函数,来进行后续的处理。请求到来时创建,请求结束后销毁。 运行流程图 showImg(https://segmentfault.com/img/remote/1460000017207791);showImg(https://s...
摘要:模式,单实例多进程,常用于多语言混编,比如等,不支持端口复用,需要自己做应用的端口分配和负载均衡的子进程业务代码。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。 showImg(https://segmentfault.com/img/remote/1460000019425391?w=1440&h=1080); Nod...
阅读 1253·2023-04-26 02:38
阅读 934·2023-04-25 20:13
阅读 3592·2021-11-19 11:31
阅读 2399·2019-08-30 15:55
阅读 2720·2019-08-30 14:11
阅读 3160·2019-08-30 13:45
阅读 1374·2019-08-29 18:41
阅读 1149·2019-08-29 16:18