js有个事件处理机制,当事件被触发时,调用设置的回调函数。
好比说php
$("#div").on('click',function(){ // 代码段 });
那么身为世界上最好的语言,php能作到吗?
答案是确定的,好比 swoolehtml
$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.\n"; }); $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.\n"; }); $serv->start();
再好比 Phalcon 的 RESET APIapi
$app = new Phalcon\Mvc\Micro(); //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用这麽帅气的事情,臣妾作不到啊。
俗话说 内事不决问百度,外事不决问谷哥,
而后度娘告诉了我这个 大神的博文swoole
PHP回调函数的实现方法app
大神说了下原理,我想了想写了这麽个东西,框架
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建立函数,这点我以为没有必要,若是是调用一个对象的方法,里面用到对象的属性,那么传参数直接将对象传递过来就好。post
对此我再说一下 ,原本是这样的this
$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 ; \n "; echo " b = $b ; \n "; echo " a + b = ".( $a + $b) . ";\r\n "; } ); $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 ;\r\n"; echo " b = $b ;\r\n"; echo " static = ".self::$static." ;\r\n"; echo " nomal = ".$this->nomal." ;\r\n"; echo " add = ".$this->add." ;\r\n"; } }
接着来
$test = new test; $test->add = " this is new add "; $MyClass->on('post' ,array( $test , 'demo' ) ); $MyClass->trigger('post' , array( 123 , 321 ) );
ok , 没有问题。
其实我想到了另外一件事情,
有个对象数组 $objects , 咱们给每个对象绑定各自的事件和事件的回调方案,
好比说,小偷来了,咱们要打110;朋友来了,咱们要请客吃饭。
我不知道实际的项目中有没有这种情景须要,而且暂时没想过怎么处理。