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

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

jacklove
jackloveオリジナル
2018-07-04 18:00:071412ブラウズ

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 による配列 :

$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
*/

概要

上記は、エディターが紹介する PHP です。ご質問がございましたら、メッセージを残していただければ、編集者が時間内に返信させていただきます。また、php 中国語 Web サイトをサポートしていただきありがとうございます。

#興味があるかもしれない記事:

ソースコード分析 Laravel が同じキュータスクを繰り返し実行する理由を説明します

Laravel Redis で複数のプロセスが同時にキューを取得する問題の詳細な説明

php-msf ソース コードの詳細な説明


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

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