コールバック関数の原理とPHPの例

WBOY
リリース: 2016-06-13 12:23:46
オリジナル
858 人が閲覧しました

コールバック関数の原理と PHP の例

背景: 最近の開発プロジェクトでは、ユーザーは長い間考えた結果、一連のクエリ アクティビティを開始する前に、まずサービスを呼び出す必要があります。同僚は、コールバック関数を使用するとこの問題を解決できると教えてくれました。ここでは、PHPにおけるコールバック関数の原理と実装について説明します。


1 コールバックとは

ソフトウェア モジュール間には常に一定の違いがあります インターフェイス呼び出し方法の観点から、同期呼び出し、コールバック、非同期呼び出しの 3 つのカテゴリに分類できます。同期呼び出しはブロッキング呼び出しであり、呼び出し元は相手が実行を完了するまで待機する必要があります。これは一方向呼び出しであり、呼び出し先も呼び出します。相手のインターフェースが呼び出されます。非同期呼び出しは、メッセージやイベントと同様のメカニズムですが、その呼び出し方向はまったく逆です。インターフェースのサービスが特定のメッセージを受信したり、イベントが発生したりすると、アクティブに通知されます。クライアント (つまり、クライアント インターフェイスを呼び出します)。コールバックと非同期呼び出しの関係は非常に密接です。通常、コールバックを使用して非同期メッセージを登録し、非同期呼び出しを通じてメッセージ通知を実装します。同期呼び出しは 3 つの中で最も単純であり、多くの場合、コールバックが非同期呼び出しの基礎となるため、以下ではさまざまなソフトウェア アーキテクチャでのコールバック メカニズムの実装に焦点を当てます。

さまざまな種類の言語 (構造化言語やオブジェクト言語など)、プラットフォーム (Win32、JDK)、またはアーキテクチャ (CORBA、DCOM、WebService) について、同期に加えて、クライアント間の対話特定の非同期通知メカニズムを使用すると、サービス プロバイダー (またはインターフェイス プロバイダー) が特定の状況下で顧客に積極的に通知できるようになり、コールバックは非同期実装を実現する最も簡単な方法です。一般的な構造化言語の場合、コールバックはコールバック関数を通じて実装できます。コールバック関数も関数またはプロシージャですが、呼び出し先が使用するために呼び出し元によって実装される特別な関数です。
オブジェクト指向言語では、コールバックはインターフェイスまたは抽象クラスを通じて実装され、このインターフェイスを実装するクラスをコールバック クラスと呼び、コールバック クラスのオブジェクトがコールバック オブジェクトになります。 C++ や Object Pascal などの手続き型機能と互換性のあるオブジェクト言語の場合、コールバック オブジェクト、コールバック メソッドなどの機能を提供するだけでなく、手続き型言語のコールバック関数機構とも互換性があります。 Windows プラットフォームのメッセージ メカニズムは、メッセージを受信して​​処理するという目的を達成するために、システムが提供するインターフェイスを介してメッセージ処理関数 (つまり、コールバック関数) を登録します。 Windows プラットフォームの API は C 言語で構築されているため、コールバック関数の特殊なケースと考えることができます。分散コンポーネント エージェント システム CORBA には、コールバック、イベント サービス、通知サービスなど、非同期処理のメソッドが多数あります。イベント サービスと通知サービスは、非同期メッセージを処理するために CORBA によって使用される標準サービスであり、主にメッセージの処理、配布、メンテナンスなどを担当します。単純な非同期処理の場合は、コールバック メカニズムを通じて実装できます。

2 PHP コールバック関数の実装方法


2.1 グローバル関数コールバック

ここでのグローバル関数とは、関数を使用して直接定義された関数を指します。オブジェクトやオブジェクトには含まれません。クラス。次の例を参照してください。
function fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1 ;
echo "
n";
echo 'msg2:'.$msg2;

}


$fnName = "fnCallBack" //メソッド名
$params = array( 'hello' , 'world' );//パラメータに渡される値

call_user_func_array( $fnName , $params );

結果:


コードの説明:
ここでは、呼び出しを行うために PHP 組み込み関数 call_user_func_array が使用されます。 call_user_func_array には 2 つのパラメータがあります。最初のパラメータは呼び出される関数の名前を示す文字列で、2 番目のパラメータは呼び出される関数に順番に渡されるパラメータ リストを示します。

2.2 クラスの静的メソッドのコールバック
コールバックしたいメソッドがクラスの静的メソッドの場合、どうすればよいでしょうか? PHP の組み込み call_user_func_array メソッドを使用して呼び出しを行うこともできます。例を参照してください。
サンプル コード:
class MyClass
{
パブリック静的関数 fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1;
echo "
n";
echo 'msg2:'.$msg2;
}
}


$className = 'MyClass'; //クラス名
$fnName = "fnCallBack"; class
$params = array( 'hello' , 'world' );//パラメータに渡される値
call_user_func_array( array( $className , $fnName ) , $ params );


結果:


コードの説明:
このコードは、最初のメソッドのコードと非常によく似ています。call_user_func_array の最初のパラメーターとしてクラス名 (MyClass) を渡してクラスを実装します。静的メソッドのコールバックがなくなりました。このとき、call_user_func_array の最初のパラメータは配列であることに注意してください。このメソッドを使用してクラスを呼び出すと、配列の最初の要素はクラス名、2 番目の要素は呼び出される関数名になります。非静的メソッド (つまり、静的メソッドを削除) の場合、結果はどうなりますか?次のコードを参照してください。


class MyClass
{
public function fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1;
echo "
n";
echo 'msg2:'.$msg2;
}
}
$className = 'MyClass';
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( array( $ className , $fnName ) , $params );最終的な実行結果は元の結果と同じです

2.3 オブジェクト メソッドのコールバック



I まず、以下に示すように、文字列形式で最も原始的な呼び出しメソッドを使用してみました。
class MyClass
{
private $name = 'abc';
パブリック関数 fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' )
{
echo 'オブジェクト名:'.$this->name;
echo "
n";
echo ' msg1:'.$msg1;
echo "
n";
echo 'msg2:'.$msg2;
}
}
$myobj = new MyClass();
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
$myobj->$fnName();
結果:


呼び出しは成功しましたが、パラメータ params をこのメソッドに渡すにはどうすればよいですか? params を直接渡した場合、パラメータとして使用されます。 PHP マニュアルを確認すると、create_function 関数で文字列を使用して匿名関数を作成できることがわかりました。この匿名関数でコールバック関数を呼び出し、パラメータが渡されます。
まず、以下に示すように、匿名関数 anonymous を手動で作成します。
class MyClass
{
private $name = 'abc';
public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' )
{
echo 'オブジェクト名:'.$this->name;
echo "
n";
br />n"; echo 'msg2:'。 $msg2;
}
}
$myobj = new MyClass();
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' ) ;
//匿名関数の構築
function anonymous()
{
global $myobj;
global $fnName;
global $params;
$myobj->$fnName( $params[0] , $params[1] );
}
anonymous();
成功しました。効果は次のとおりです:
参考: http://myceo.blog.51cto.com/2340655/725411/http://blog.chinaunix.net/uid -20684384 -id-1895266.html
http://segmentfault.com/a/1190000002901770


http://www.abc3210.com/2012/phper_07/php- callback.shtml



上記の参考文献とブロガーに感謝します。

著作権に関する声明: こんにちは、CSDN で皆さんにお会いできてとてもうれしいです。皆さんと友達になれることを願っています!

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート