ホームページ >バックエンド開発 >PHPチュートリアル >PHP 5.3 クロージャ構文の概要 function() use() {}_PHP チュートリアル
PHP 5.3 では、開発者がインライン関数を宣言して変数に保存できる、匿名関数とも呼ばれるクロージャー構文が追加されています。この構文は JavaScript クロージャーと比べると少し奇妙ですが、PHP 言語への優れた追加です
コードは次のとおりです | コードをコピー |
/** * 以下のコードは PHP5.3 以降で正常に動作します。 */ 関数コールバック($callback) { $callback(); } //出力: これは匿名関数です。 /n //ここでは、転送用の匿名関数を直接定義します。以前のバージョンでは、これは利用できませんでした。 // さて、この構文は非常に快適で、基本的に JavaScript 構文と同じです。これが基本であると言われる理由は、読み続ける必要があるためです 。 //結論: 快適な文法は間違いなく人気になります コールバック(関数() { print "これは匿名関数です。 /n"; }); //出力: これはクロージャを使用する文字列値です。メッセージは次のとおりです: こんにちは、皆さん。 /n //ここでまずクロージャを定義し、今度は戸籍簿に名前が載っています... //使用してください、新鮮な男... //ご存知のとおり、クロージャ: 内部関数は外部関数で定義された変数を使用します。 //PHP の新しく開かれたクロージャ構文では、クロージャの外側で定義された変数を使用するために use を使用します。 //ここでは外部変数 $msg を使用します。定義後、その値はクロージャーの実行後に変更され、元の値が出力されます。 //結論: 値によって渡される基本型パラメーターの場合、クロージャーの使用の値はクロージャーの作成時に決定されます。 $msg = "皆さん、こんにちは"; $callback = function () use ($msg) { print "これはクロージャを使用する文字列値です。msg は $msg. /n"; }; $msg = "皆さん、こんにちは"; コールバック($callback); //出力: これは文字列値の遅延バインドを使用するクロージャです。メッセージは次のとおりです: こんにちは、皆さん。 /n //参照メソッドを変更します。参照メソッドを使用します //今回の出力はクロージャ定義後の値であることが分かります... //これを理解するのは実際には難しくありません。参照によって使用し、クロージャーは $msg 変数のアドレスを使用します //後で$msgというアドレスの値が変更された場合、このアドレスの値をクロージャで出力すると自然に変更されます $msg = "皆さん、こんにちは"; $callback = function () use (&$msg) { print "これは文字列値の遅延バインドを使用するクロージャです。メッセージは $msg です。 /n"; }; $msg = "皆さん、こんにちは"; コールバック($callback); //出力: これはクロージャ使用オブジェクトです。メッセージは: こんにちは、皆さん。 /n // クロージャの出力は、以前にコピーされたオブジェクトで、その値は Hello,Everyone で、その後に $obj という名前が再割り当てされます。 //こう考えてみてはいかがでしょうか //1. obj はオブジェクトの名前です 皆さんこんにちは //2. オブジェクト Hello,Everyone はクロージャによって使用され、クロージャは Hello,Everyone オブジェクトへの参照を生成します //3. obj はオブジェクトの名前に変更されます 皆さん、こんにちは //4. こんにちは、みなさんオブジェクトではなく、obj という名前で表されるエンティティが変更されていることに注意してください。したがって、自然クロージャの出力は以前のこんにちは、みなさん のままです。 $obj = (オブジェクト) "皆さん、こんにちは"; $callback = function () use ($obj) { print "これはクロージャ使用オブジェクトです。メッセージは: {$obj->scalar}. /n"; }; $obj = (オブジェクト) "皆さん、こんにちは"; コールバック($callback); //出力: これはクロージャ使用オブジェクトです。メッセージは: こんにちは、皆さん。 /n //上記の手順に従って、段階的に実行してみましょう: //1. オブジェクト名は Hello,Everyone オブジェクトを指します //2. クロージャーは、Hello,Everyone オブジェクトを指す参照を生成します //3. obj 名が指すオブジェクトのスカラー値を変更します (つまり、Hello,Everyone オブジェクト)。 //4. クロージャを実行すると、実際には実際のオブジェクトは 1 つだけなので、出力は自然に次のようになります。 $obj = (オブジェクト) "皆さん、こんにちは"; $callback = function () use ($obj) { print "これはクロージャ使用オブジェクトです。メッセージは: {$obj->scalar}. /n"; }; $obj->scalar = "皆さん、こんにちは"; コールバック($callback); //出力: これはクロージャ使用オブジェクトの遅延バインドです。メッセージは: こんにちは、皆さん。 /n // クロージャは何を参照していますか? &$obj、クロージャによって生成された参照は、名前 $obj. が指すアドレスを指します。 //したがって、obj がどんなに変化しても、逃げ場はありません.... //つまり、出力は変更された値になります $obj = (オブジェクト) "皆さん、こんにちは"; $callback = function () use (&$obj) { print "これはクロージャ使用オブジェクト遅延バインドです。メッセージは: {$obj->scalar}. /n"; }; $obj = (オブジェクト) "皆さん、こんにちは"; コールバック($callback); /** * クロージャを使用したカウンタジェネレータ ※これは実際にPythonでクロージャを導入する例に基づいています... * このように考えることができます: * 1. counter 関数が呼び出されるたびに、ローカル変数 $counter が作成され、1 に初期化されます。 * 2. 次に、ローカル変数 $counter への参照を生成するクロージャーを作成します。 * 3. 関数 counter は作成したクロージャを返し、ローカル変数を破棄しますが、このときクロージャから $counter への参照があり、 * リサイクルされないので、関数カウンターによって返されるクロージャはフリー状態を保持します と理解できます。 * 変数 * 4. counter の呼び出しごとに独立した $counter とクロージャが作成されるため、返されるクロージャは互いに独立しています。 * 5. 返されたクロージャを実行し、クロージャが保持する自由状態変数をインクリメントして返します。結果はカウンタです * 結論: この関数は独立したカウンターを生成するために使用できます。 */ 関数 counter() { $counter = 1; return function() use(&$counter) {return $counter ++;}; } $counter1 = counter(); $counter2 = counter(); echo "counter1: " 。 $counter1() 。 " /n"; echo "counter1: " 。 $counter1() 。 " /n"; echo "counter1: " 。 $counter1() 。 " /n"; echo "counter1: " 。 $counter1() 。 " /n"; echo "counter2: " 。 $counter2() 。 " /n"; echo "counter2: " 。 $counter2() 。 " /n"; echo "counter2: " 。 $counter2() 。 " /n"; echo "counter2: " 。 $counter2() 。 " /n"; ?> |