PHP回调函数(二):应用之事件处理机制

92 阅读1分钟

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

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

起因

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的搭配写法:

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 官网说明

大神在他的博客里说了三种类型函数的调用方法和传参方法.

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

</>复制代码 
$func = array( "类名","类的方法名"  );
$args = array("参数1","参数2") ;
call_user_func_array( $func , $args );

这里面的 $func 都是 字符串 , 当调用的方法里有$this这种东西时,会报错($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;朋友来了,我们要请客吃饭。

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