摘要:起因有個事件處理機制,當事件被觸發(fā)時,調用設置的回調函數(shù)。其實我想到了另一件事情,有個對象數(shù)組,我們給每一個對象綁定各自的事件和事件的回調方案,比如說,小偷來了,我們要打朋友來了,我們要請客吃飯。
起因
js有個事件處理機制,當事件被觸發(fā)時,調用設置的回調函數(shù)。
比如說
$("#div").on("click",function(){ // 代碼段 });
那么身為世界上最好的語言,php能做到嗎?
答案是肯定的,比如 swoole
$serv = new swoole_server("127.0.0.1", 9501); $serv->set(array( "worker_num" => 8, //工作進程數(shù)量 "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回調函數(shù)的實現(xiàn)方法
大神說了下原理,我想了想寫了這麼個東西,
class MyClass{ public $eventMap = array(); function on($evtname , $handle ){ //注冊一個事件上的響應回調函數(shù) $this->eventMap[$evtname]=$handle; } function trigger($evtname , $scope=null){ //觸發(fā)一個事件,也就是循環(huán)調用所有響應這個事件的回調函數(shù) call_user_func_array( $this->eventMap[$evtname] , $scope); } }
里面用了這么個東西 call_user_func_array 官網(wǎng)說明
大神在他的博客里說了三種類型函數(shù)的調用方法和傳參方法,博客里提到 為了能使用對象的屬性,用create_function創(chuàng)建函數(shù),這點我覺得沒有必要,如果是調用一個對象的方法,里面用到對象的屬性,那么傳參數(shù)直接將對象傳遞過來就好。
對此我再說一下 ,本來是這樣的
$func = array( "類名","類的方法名" ); $args = array("參數(shù)1","參數(shù)2") ; call_user_func_array( $func , $args );
這里面的 $func 都是 字符串 , 當調用的方法里有$this這種東西時,回報錯,
那么我建議是這樣
$func = array( $object ,"類的方法名" ); $args = array("參數(shù)1","參數(shù)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 ) );//框架內部觸發(fā)
舉個例子
我們希望根據(jù)http的不同請求調用不同的函數(shù)來處理;
比如說接收到了post請求,此時就調用post對應的注冊函數(shù)。
然后是換個類的方法
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 , 沒有問題。
其實我想到了另一件事情,
有個對象數(shù)組 $objects , 我們給每一個對象綁定各自的事件和事件的回調方案,
比如說,小偷來了,我們要打110;朋友來了,我們要請客吃飯。
我不知道實際的項目中有沒有這種情景需要,并且暫時沒想過怎么處理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/20980.html
摘要:當某個執(zhí)行完畢時,將以事件的形式通知執(zhí)行操作的線程,線程執(zhí)行這個事件的回調函數(shù)。為了處理異步,線程必須有事件循環(huán),不斷的檢查有沒有未處理的事件,依次予以處理。另外,單線程帶來的好處,操作系統(tǒng)完全不再有線程創(chuàng)建銷毀的時間開銷。 前言 如果你有一定的前端基礎,比如 HTML、CSS、JavaScript、jQuery;那么,Node.js 能讓你以最低的成本快速過渡成為一個全棧工程師(我稱...
摘要:當某種網(wǎng)絡事件發(fā)生時,會回調用戶設置的指定回調函數(shù)。承擔了底層網(wǎng)絡事件的監(jiān)聽及各種底層事件處理,當收到請求時,會觸發(fā)事件提醒,然后將控制權轉交預先注冊的事件回調函數(shù),來進行后續(xù)的處理。請求到來時創(chuàng)建,請求結束后銷毀。 運行流程圖 showImg(https://segmentfault.com/img/remote/1460000017207791);showImg(https://s...
摘要:模式,單實例多進程,常用于多語言混編,比如等,不支持端口復用,需要自己做應用的端口分配和負載均衡的子進程業(yè)務代碼。就是我們需要一個調度者,保證所有后端服務器都將性能充分發(fā)揮,從而保持服務器集群的整體性能最優(yōu),這就是負載均衡。 showImg(https://segmentfault.com/img/remote/1460000019425391?w=1440&h=1080); Nod...
閱讀 1325·2023-04-26 02:38
閱讀 968·2023-04-25 20:13
閱讀 3620·2021-11-19 11:31
閱讀 2420·2019-08-30 15:55
閱讀 2753·2019-08-30 14:11
閱讀 3189·2019-08-30 13:45
閱讀 1404·2019-08-29 18:41
閱讀 1198·2019-08-29 16:18