PHPイベント処理機構(コールバック関数)

WBOY
リリース: 2016-06-20 12:54:32
オリジナル
925 人が閲覧しました

原因

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.\n";});$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.\n";});$serv->start();
ログイン後にコピー

別の例は、Phalcon の RESET API

<br />$app = new Phalcon\Mvc\Micro();//Retrieves all robots$app->get('/api/robots', function() {});//Searches for robots with $name in their name$app->get('/api/robots/search/{name}', function($name) {});
ログイン後にコピー

などです

Start

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. 公式サイトの説明

マスターがブログで書いた、3 種類の関数の呼び出しメソッドとパラメータの受け渡しメソッドについて説明しました。オブジェクトのプロパティを使用するには、 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 );
ログイン後にコピー

そうすれば問題はありません。
効果を見てみましょう
人気のあるものから始めましょう

<br />$MyClass = new MyClass;$MyClass->on('post' , function($a , $b ){             echo " a = $a ; \n ";             echo " b = $b ; \n ";             echo " a + b = ".( $a + $b) . ";\r\n ";    } );$MyClass->trigger('post' , array( 123 , 321 )  );//框架内部触发
ログイン後にコピー


さまざまな http リクエストに応じてさまざまな関数を呼び出したいと考えています。
たとえば、受信 投稿リクエストに到達すると、投稿に対応する登録関数が呼び出されます。

次にクラスを変更する方法です

class test{    static $static = "this is  static ";    public $nomal = "this is nomal ";    function demo($a , $b ){        echo " a = $a ;\r\n";        echo " b = $b ;\r\n";        echo " static = ".self::$static." ;\r\n";        echo " nomal = ".$this->nomal." ;\r\n";        echo " add = ".$this->add." ;\r\n";    }}
ログイン後にコピー

次に

$test = new test;$test->add = " this is new add ";$MyClass->on('post' ,array( $test , 'demo' ) );$MyClass->trigger('post' , array( 123 , 321 )  );
ログイン後にコピー

OK、問題ありません。

実は、別のことを考えました。
オブジェクト配列 $objects があり、各オブジェクトを独自のイベントとイベント コールバック プランにバインドします。
たとえば、泥棒が来ます。友達が来たら、夕食をごちそうしたいので、110番に電話しなければなりません。

この状況が実際のプロジェクトで必要かどうかはわかりませんし、対処方法は今のところ考えていません。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!