国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

php的事件處理機制(回調函數)

Forelax / 674人閱讀

摘要:起因有個事件處理機制,當事件被觸發時,調用設置的回調函數。其實我想到了另一件事情,有個對象數組,我們給每一個對象綁定各自的事件和事件的回調方案,比如說,小偷來了,我們要打朋友來了,我們要請客吃飯。

起因

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

相關文章

  • 來,告訴你Node.js究竟是什么?

    摘要:當某個執行完畢時,將以事件的形式通知執行操作的線程,線程執行這個事件的回調函數。為了處理異步,線程必須有事件循環,不斷的檢查有沒有未處理的事件,依次予以處理。另外,單線程帶來的好處,操作系統完全不再有線程創建銷毀的時間開銷。 前言 如果你有一定的前端基礎,比如 HTML、CSS、JavaScript、jQuery;那么,Node.js 能讓你以最低的成本快速過渡成為一個全棧工程師(我稱...

    Jonathan Shieber 評論0 收藏0
  • Node_模塊

    摘要:當某個執行完畢時,將以時間的形式通知執行操作的線程,線程執行了這個事件的回調函數。為了處理異步,線程必須有事件循環,不斷的檢查是否有未處理的時間。這種處理機制,稱為事件環機制。方面使用第三方模塊。 簡介 V8引擎本身就是用于Chrome瀏覽器的JS解釋部分,但是Ryan Dahl,把V8搬到服務器,用于做服務器的軟件。Node是一個專注于實現高性能Web服務器優化的專家,在遇到V8而誕...

    zero 評論0 收藏0
  • swoole入門4-初識swoole

    摘要:當某種網絡事件發生時,會回調用戶設置的指定回調函數。承擔了底層網絡事件的監聽及各種底層事件處理,當收到請求時,會觸發事件提醒,然后將控制權轉交預先注冊的事件回調函數,來進行后續的處理。請求到來時創建,請求結束后銷毀。 運行流程圖 showImg(https://segmentfault.com/img/remote/1460000017207791);showImg(https://s...

    forsigner 評論0 收藏0
  • Node.js運行原理、高并發性能測試對比及生態圈匯總

    摘要:模式,單實例多進程,常用于多語言混編,比如等,不支持端口復用,需要自己做應用的端口分配和負載均衡的子進程業務代碼。就是我們需要一個調度者,保證所有后端服務器都將性能充分發揮,從而保持服務器集群的整體性能最優,這就是負載均衡。 showImg(https://segmentfault.com/img/remote/1460000019425391?w=1440&h=1080); Nod...

    kamushin233 評論0 收藏0

發表評論

0條評論

Forelax

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<