亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

php的事件處理機(jī)制(回調(diào)函數(shù))

Forelax / 730人閱讀

摘要:起因有個(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

相關(guān)文章

  • 來(lái),告訴你Node.js究竟是什么?

    摘要:當(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)...

    Jonathan Shieber 評(píng)論0 收藏0
  • Node_模塊

    摘要:當(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而誕...

    zero 評(píng)論0 收藏0
  • swoole入門(mén)4-初識(shí)swoole

    摘要:當(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...

    forsigner 評(píng)論0 收藏0
  • Node.js運(yùn)行原理、高并發(fā)性能測(cè)試對(duì)比及生態(tài)圈匯總

    摘要:模式,單實(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...

    kamushin233 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Forelax

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<