摘要:起因有個事件處理機制,當事件被觸發時,調用設置的回調函數。其實我想到了另一件事情,有個對象數組,我們給每一個對象綁定各自的事件和事件的回調方案,比如說,小偷來了,我們要打朋友來了,我們要請客吃飯。
起因
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;朋友來了,我們要請客吃飯。
我不知道實際的項目中有沒有這種情景需要,并且暫時沒想過怎么處理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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...
閱讀 1249·2023-04-26 02:38
閱讀 928·2023-04-25 20:13
閱讀 3589·2021-11-19 11:31
閱讀 2396·2019-08-30 15:55
閱讀 2717·2019-08-30 14:11
閱讀 3157·2019-08-30 13:45
閱讀 1371·2019-08-29 18:41
閱讀 1147·2019-08-29 16:18