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.\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 API
$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回調函數的實現方法
大神說了下原理,我想了想寫了這麼個東西,
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 );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;朋友來了,我們要請客吃飯。
我不知道實際的項目中有沒有這種情景需要,并且暫時沒想過怎么處理。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!