ホームページ >バックエンド開発 >PHPチュートリアル >PHPイベント処理機構(コールバック関数)
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) {});
などです
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番に電話しなければなりません。
この状況が実際のプロジェクトで必要かどうかはわかりませんし、対処方法は今のところ考えていません。