web-dev-qa-db-ja.com

関数でキーワードを使用する-PHP

可能性のある複製:
PHP 5.3.0では、機能「使用」識別子とは何ですか?正気のプログラマーはそれを使うべきですか?

私はPHP=

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

そして、このコードでuseの使用法について説明してください。

function ($quantity, $product) use ($tax, &$total)

PHPでuseを検索すると、名前空間で使用されているuseキーワードが見つかりますが、ここでは異なっています。

ありがとう。

71
Tarik

この場合も「使用」の使用は正しいです。

クロージャーでは、関数のコンテキスト外にある変数にアクセスするには、use関数を使用して関数に明示的に許可を与える必要があります。この場合の意味は、関数に$ taxおよび$ total変数へのアクセスを許可することです。

クロージャーが定義されている行のすぐ上で$ totalが設定されている間に、$ taxがgetTotal関数のパラメーターとして渡されたことに気付くでしょう。

指摘すべきもう1つのことは、$ taxはコピーとして渡され、$ totalは参照によって渡されることです(前に&記号を追加することによって)。参照渡しにより、クロージャは変数の値を変更できます。この場合の$ taxの値の変更は、クロージャー内でのみ有効で、実際の$ totalの値は変更されます。

105

PHPで匿名関数を宣言する場合、周囲のスコープ(存在する場合)からどの変数を閉じるか)を指定する必要があります。 useの後のリストは、クローズする変数のリストです。

15
hobbs

つまり、内部関数は、パラメーターだけでなく、外部関数の変数$ taxおよび$ totalを使用できます。

2
Yuri Stuken