PHP では、クロージャとは何ですか? また、なぜ「use」識別子を使用するのですか? 質問する

PHP では、クロージャとは何ですか? また、なぜ「use」識別子を使用するのですか? 質問する

いくつかの機能をチェックしていたPHP 5.3.0ところ、サイト上でかなり面白いコードを見つけました。

public function getTotal($tax)
{
    $total = 0.00;

    $callback =
        /* This line here: */
        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);
}

一例として匿名関数

これについて知っている人はいますか?ドキュメントはありますか?見た目は悪質ですが、使用すべきでしょうか?

ベストアンサー1

もっと簡単な答え。

function ($quantity) use ($tax, &$total) { .. };

  1. クロージャは変数に割り当てられた関数なので、それを渡すことができます
  2. クロージャは別の名前空間であり、通常、この名前空間の外部で定義された変数にアクセスすることはできません。そこでuseキーワードを使用します。
  3. use を使用すると、クロージャ内の後続の変数にアクセス (使用) できます。
  4. useは早期バインディングです。つまり、変数の値はクロージャの定義時にコピーされます。したがって、$taxオブジェクトのようにポインターでない限り、クロージャ内での変更は外部に影響しません。
  5. の場合のように、変数をポインターとして渡すことができます&$total。このように、 の値を変更すると$total外部効果が発生し、元の変数の値が変更されます。
  6. クロージャ内で定義された変数は、クロージャの外部からもアクセスできません。
  7. クロージャと関数の速度は同じです。はい、スクリプト全体で使用できます。

@Mytskine として指摘したおそらく最も詳しい説明はクロージャのRFC(彼に賛成票を投じてください。)

おすすめ記事