PHPでクロージャーを使用する良い例

バージョン5.3以降、PHPではクロージャーを作成できます。 残念ながら、公式ドキュメントhttp://www.php.net/manual/en/functions.anonymous.php#example-163 (例3)でのそれらの使用例は、洗練されていて、とてつもないものです。 カットの下の例が、array_map()のような関数を除いて、クロージャーの他の用途を見るのに役立つことを願っています。



アプリケーションのパフォーマンスを向上させるための最も一般的な方法はキャッシュであり、通常、アプリケーションのスキームは次のようになります。

<?php Class Cache { static function set( $key, $value) { //     } static function get( $key ) { //     } } Class PostModel { static function getList($dateCreated) { //       } } $dateCreated = date('Ym-d'); $posts = Cache::get("posts_" . $dateCreated); if( !$posts ) { $posts = PostModel::getList($dateCreated); Cache::set( "posts_" . $dateCreated , $posts); } ?>
      
      







データが見つからない場合、キャッシュからデータを取得しようとしています-データベースにリクエストを行い、結果をキャッシュに書き込みます。 ロジックは毎回ほぼ同じであり、そのような場合にユニバーサルラッパーを作成しますが、変数に変数を渡すだけでなく、ラッパー内で既に実行されるコードの一部、つまり、 遅れましたか?



そして、ここでクロージャーが助けになります。遅延した実行のために関数(またはメソッド)にコードを渡すために、匿名関数でそれをラップする必要があります。

 <?php $dateCreated = date('Ym-d'); $dbQueryCounter = 0; $fallback = function() use($dateCreated, &$dbQueryCounter) { $dbQueryCounter++; //      return PostModel::getList($dateCreated); //   return }; Cache::wrapper( "posts_" . $dateCreated , $fallback ); Class Cache { static function set( $key, $value) { //     } static function get( $key ) { //     } static function wrapper( $key, Closure $fallback ) { $data = self::get( $key ); if( !$data ) { $data = $fallback(); //    self::set( $key, $data); } return $data; } } ?>
      
      





このコードで注意する必要があるもの:

  1. クロージャを使用すると、メソッド(関数)に渡すか、メソッドから戻ることができます。このコードが宣言されている環境のローカル変数を使用して、実行準備の整ったコードのフラグメントを返します。
  2. 遅延実行のためにメソッドに渡すコードがデータを返す必要がある場合、クロージャーでの戻りを忘れないでください。
  3. コードフラグメントと一緒に、クロージャーを通じて、useキーワードを使用してこのコードが使用されるコンテキストから必要なすべての変数を渡すことができます-これは、PHP 5.3で匿名関数を宣言することと以前のバージョンでcreate_function()を使用することの基本的な違いです。
  4. 変数はvalueによってクロージャーにインポートされるため、クロージャー内で変数を変更する必要がある場合(カウンター$ dbQueryCounterなど)、参照によってインポートする必要があります。
  5. PHP5.3の匿名関数はClosureクラスのインスタンスです-この状況を使用して、メソッドに渡される変数の型を制御できます。



All Articles