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