ホームページ  >  記事  >  バックエンド開発  >  コールバック関数の原理とPHPの例

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

WBOY
WBOYオリジナル
2016-06-23 13:28:291005ブラウズ

背景: 最近の開発プロジェクトでは、ユーザーは一連のクエリ アクティビティを開始する前に、まずサービスを呼び出す必要があります。長い間考えた後、同僚がコールバック関数を使用することで問題を解決できることを思い出しました。ここでは、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 '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
{
public static function fnCallBack( $msg1, $msg2 )
{
echo 'msg1:'.$ msg1;
echo "
n" echo 'msg2:'.$msg2;
}


$className = 'MyClass';名前 = "fnCallBack"; // クラス内のメソッド名
$params = array( 'hello' , 'world' );// パラメータに渡される値
call_user_func_array( array( $className , $fnName ) , $params );
結果:



コードの説明:
このコードは、最初のメソッドのコードと非常によく似ています。call_user_func_array の最初のパラメーターとしてクラス名 (MyClass) を渡し、クラスの静的メソッドのコールバックを実装します。この時点では、call_user_func_array の最初のパラメータが配列であることに注意してください。配列の最初の要素はクラス名であり、2 番目の要素は呼び出される関数の名前です。 -クラスの static メソッド (つまり、static を削除)、結果はどうなるでしょうか?次のコードを見てください。
class MyClass
{
public function fnCallBack( $msg1 , $msg2 )
echo 'msg1:'.$msg2:' .$msg2;
}
}
$className = 'マイクラス' ;
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( array( $className , $fnName ) , $params );オリジナル


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

まず、以下に示すように、文字列形式の最も原始的な呼び出しメソッドで試してみました。 = 'デフォルト msg1' , $msg2 = 'デフォルト msg2' )
{
echo 'オブジェクト名:'.$this->name;
echo "< ;br />n";
echo 'msg1:' $msg1; echo "< . ();
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
$myobj->$fnName();

結果:



呼び出しは成功しましたが、パラメータ params をこのメソッドに渡すにはどうすればよいでしょうか? params が直接渡された場合、それはパラメータとして使用されます。 PHP マニュアルを確認すると、create_function 関数で文字列を使用して匿名関数を作成できることがわかりました。この匿名関数でコールバック関数を呼び出し、パラメータが渡されます。
まず、匿名関数 anonymous を手動で作成します。以下に示すように、以前に学習したメソッドを使用してコールバック関数を呼び出します。 msg1 = 'デフォルト msg1', $ mg2 = 'デフォルト msg2')
{

{'o: $

echo 'msg1: '
echo "
n";エコー'msg2:'.$msg2;
using - - - of array( 'hello' , 'world' )
//匿名関数の構築
function anonymous()

{

global $myob j;

グローバル $fnName ;
グローバル $params;

$myobj->$fnName( $params[0] , $params[1] );

成功。効果は次のとおりです。

参考文献:
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 で皆さんにお会いできてとても嬉しいです!皆さんと友達になれることを願っています!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。