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;朋友來了,咱們要請客吃飯。
我不知道實際的項目中有沒有這種情景須要,而且暫時沒想過怎麼處理。