ホームページ  >  記事  >  バックエンド開発  >  PHP クロージャと匿名関数 (詳細なチュートリアル)

PHP クロージャと匿名関数 (詳細なチュートリアル)

亚连
亚连オリジナル
2018-06-08 15:35:491559ブラウズ

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() を使用して配列を処理し、各項目をインクリメントします。 array by 1 :

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

追加の状態

PHP クロージャは、実際の javascrypt クロージャのようにアプリケーションの状態を自動的にカプセル化しません。手動で呼び出します。 クロージャ オブジェクトの bindingTo() メソッドまたは use キーワードを使用して、状態を PHP クロージャにアタッチします。

use キーワードを使用する

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

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");

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

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

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

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

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

class TestClosure
{
  private $name=[];
  private $age;
  private $sex;
  public function addPerson($name, $personCallback){
    // 将闭包对象绑定当前实例
    $this->name[$name] = $personCallback->bindTo($this, __CLASS__);
  }
  public function display($name){
    foreach ($this->name as $key => $callback){
      if($key == $name){
        // 执行闭包对象,将闭包状态附加到类
        $callback();
      }
    }
    echo "name : {$name}\n";
    echo "age : {$this->age}\n";
    echo "sex : {$this->sex}\n";
  }
}
$person = new TestClosure();
$person->addPerson("jerry", function(){
  $this->age = 19;
  $this->sex = "man";
});
$person->display("jerry");
/** output
name : jerry
age : 19
sex : man
*/

上記は皆さんのためにまとめたもので、今後皆さんのお役に立てれば幸いです。

関連記事:

Vue コンポーネントのカスタム イベント (詳細なチュートリアル)

JS を使用して、次の小さなボールを実装する方法マウス モバイル

NW.js の基本的な使用方法の詳細な紹介

以上がPHP クロージャと匿名関数 (詳細なチュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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