匿名関数 (匿名関数) はクロージャとも呼ばれ、指定された名前なしで関数を一時的に作成できます。ほとんどの場合、callback function(callback) パラメーターの値として使用されます。もちろん、他のアプリケーションもあります。
例 #1 無名関数の例
<?php echo preg_replace_callback ( '~-([a-z])~' , function ( $match ) { return strtoupper ( $match [ 1 ]); }, 'hello-world' ); // 输出 helloWorld ?>
クロージャ関数も変数の値として使用できます。 PHP は、この 式 を組み込みクラス Closure のオブジェクト インスタンスに自動的に変換します。クロージャーオブジェクトを変数に代入する方法は、通常の変数代入の構文と同じで、最後にセミコロンを追加する必要があります:
例 #2 匿名関数の変数代入の例
<?php $greet = function( $name ) { printf ( "Hello %s\r\n" , $name ); }; $greet ( 'World' ); $greet ( 'PHP' ); ?>
クロージャは以下から継承できます。親スコープ変数。 このような変数は、use language 構造を使用して渡す必要があります。
例 #3 親スコープから変数を継承する
<?php $message = 'hello' ; // 没有 "use" $example = function () { var_dump ( $message ); }; echo $example (); // 继承 $message $example = function () use ( $message ) { var_dump ( $message ); }; echo $example (); // Inherited variable's value is from when the function // is defined, not when called $message = 'world' ; echo $example (); // Reset message $message = 'hello' ; // Inherit by-reference $example = function () use (& $message ) { var_dump ( $message ); }; echo $example (); // The changed value in the parent scope // is reflected inside the function call $message = 'world' ; echo $example (); // Closures can also accept regular arguments $example = function ( $arg ) use ( $message ) { var_dump ( $arg . ' ' . $message ); }; $example ( "hello" ); ?>
上記のルーチンの出力は次のようになります:
Notice: Undefined variable: message in /example.php on line 6 NULL string(5) "hello" string(5) "hello" string(5) "hello" string(5) "world" string(11) "hello world"
これらの変数は、関数またはクラスの先頭で宣言する必要があります。 親スコープからの変数の継承は、グローバル変数の使用とは異なります。グローバル変数は、現在どの関数が実行されているかに関係なく、グローバル スコープ内に存在します。クロージャの親スコープは、クロージャを定義する関数です (クロージャを呼び出す関数である必要はありません)。例は次のとおりです。
例 #4 クロージャとスコープ
<?php // 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。 // 其中有一个方法用来计算购物车中所有商品的总价格,该方法使 // 用了一个 closure 作为回调函数。 class Cart { const PRICE_BUTTER = 1.00 ; const PRICE_MILK = 3.00 ; const PRICE_EGGS = 6.95 ; protected $products = array(); public function add ( $product , $quantity ) { $this -> products [ $product ] = $quantity ; } public function getQuantity ( $product ) { return isset( $this -> products [ $product ]) ? $this -> products [ $product ] : FALSE ; } public function getTotal ( $tax ) { $total = 0.00 ; $callback = function ( $quantity , $product ) use ( $tax , & $total ) { $pricePerItem = constant ( CLASS . "::PRICE_" . strtoupper ( $product )); $total += ( $pricePerItem * $quantity ) * ( $tax + 1.0 ); }; array_walk ( $this -> products , $callback ); return round ( $total , 2 );; } } $my_cart = new Cart ; // 往购物车里添加条目 $my_cart -> add ( 'butter' , 1 ); $my_cart -> add ( 'milk' , 3 ); $my_cart -> add ( 'eggs' , 6 ); // 打出出总价格,其中有 5% 的销售税. print $my_cart -> getTotal ( 0.05 ) . "\n" ; // 最后结果是 54.29 ?>
匿名関数は現在、Closure クラスを通じて実装されています。
バージョン 説明
5.4.0 $thisは匿名関数に使用できます。
5.3.0 匿名関数を使用できます。
以上がPHPの匿名関数の使用例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。