ホームページ  >  記事  >  バックエンド開発  >  PHP におけるクロージャと匿名関数の分析

PHP におけるクロージャと匿名関数の分析

小云云
小云云オリジナル
2017-12-25 16:42:061392ブラウズ

クロージャは、作成時に周囲の状態をカプセル化する関数です。クロージャが配置されている環境が存在しなくなっても、クロージャにカプセル化された状態は依然として存在します。 PHP クロージャと匿名関数は通常の関数と同じ構文を使用しますが、クロージャと匿名関数は実際には関数に見せかけたオブジェクト (Closure クラスのインスタンス) です。 PHP のクロージャと匿名関数の知識を紹介します。必要な方はぜひ参考にしてください。

匿名関数は名前のない関数です。匿名関数は変数に割り当てて、他の PHP オブジェクトと同様に渡すことができます。ただし、匿名関数も関数であるため、呼び出したりパラメーターを渡したりすることができます。匿名関数は、関数またはメソッドのコールバックとして特に適しています。

注: 理論的には、クロージャと匿名関数は異なる概念です。ただし、PHP ではこれを同じ概念として扱います。したがって、クロージャを指すときは、匿名関数も指しますし、その逆も同様です。

PHP クロージャと匿名関数は通常の関数と同じ構文を使用しますが、クロージャと匿名関数は実際には関数に見せかけたオブジェクト (Closure クラスのインスタンス) です。

クロージャの作成

$closure = function($name){
  return sprintf("Hello %s", $name);
}
echo $closure("jerry");
// 检测$closure变量是否是一个闭包
var_dump($closure instanceof Closure);

上記のコードはクロージャ オブジェクトを作成し、それを $closure 変数に割り当てます。クロージャは通常の PHP 関数と非常に似ており、同じ構文を使用し、パラメータを受け取り、値を返すことができます。

説明: $closure 変数を呼び出すことができる理由は、この変数の値がクロージャであり、クロージャ オブジェクトが __invoke() マジック メソッドを実装しているためです。変数名の後に () がある限り、PHP は __invoke() メソッドを探して呼び出します。

クロージャの使用

通常、PHP クロージャは関数やメソッドのコールバックとして使用されます。多くの PHP 関数は、array_map() や preg_replace_callback() などのコールバック関数を使用します。次の例では、array_map() を使用して配列を処理し、配列内の各項目を 1 ずつ増分します。実際の javascrypt クロージャと同様に、アプリケーションの状態が自動的にカプセル化されます。クロージャ オブジェクトの bindingTo() メソッドを手動で呼び出すか、use キーワードを使用して状態を PHP クロージャに付加する必要があります。

use キーワードを使用する

use キーワードを使用してクロージャ状態を付加する方が一般的であるため、最初にこの方法を見てみましょう。 use キーワードを使用して変数をクロージャにアタッチすると、アタッチされた変数はアタッチ時に割り当てられた値を記憶します。

$nubmers = array_map(function($number){
  return $number++;
}, [1,2,3]);
var_dump($numbers);

注: use キーワードを使用して複数のパラメータをクロージャに渡します。この場合、PHP 関数やメソッドのパラメータと同様に、複数のパラメータをカンマで区切ります。

クロージャの状態をアタッチするには、bindTo() メソッドを使用します

他の PHP オブジェクトと同様に、各クロージャ インスタンスは、$this キーワードを使用してクロージャの内部状態を取得できます。クロージャ オブジェクトのデフォルト状態は役に立ちませんが、__invoke() マジック メソッドと bindingTo() メソッドがあります。

bindTo() メソッドは、クロージャに興味深い可能性を追加します。このメソッドを使用して、Closure オブジェクトの内部状態を他のオブジェクトにバインドできます。

bindTo() メソッドの 2 番目のパラメーターは非常に重要であり、その機能はバインディング クロージャのオブジェクトが属する PHP クラスを指定することです。したがって、クロージャは、クロージャがバインドされているオブジェクト内の保護されたプライベート メンバ変数にアクセスできます。

function Car ($name){
  return function($statu)use($name){
    return sprintf("Car %s is %s", $name, $statu); 
  }
}
// 将车名封装在闭包中
$car = Car("bmw");
// 调用车的动作
// 输出--> "bmw is running"
echo $car("running");

関連する推奨事項:

PHP でクロージャを使用して外部変数を取得する方法

JavaScript クロージャについての深い理解

匿名関数、入れ子関数、クロージャとは何ですか?

以上がPHP におけるクロージャと匿名関数の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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