クロージャパラメータと「use」キーワードの違いは何ですか? 質問する

クロージャパラメータと「use」キーワードの違いは何ですか? 質問する

非常に混乱しており、この質問に対する答えが見つからないようです。明確で簡単な説明があると助かります。

ベストアンサー1

use statementを捉える変数当時閉鎖関数が作成される

通常の関数の引数は、価値関数がと呼ばれる

variableとを区別していることに注意してくださいvalue

function makeAnAdder($leftNum) {
    // Notice that *each time* this makeAnAdder function gets called, we 
    // create and then return a brand new closure function.
    $closureFunc = function($rightNum) use ($leftNum) {
        return $leftNum + $rightNum;
    };

    return $closureFunc;
}

$add5to = makeAnAdder(5);
$add7to = makeAnAdder(7);

echo $add5to(10); // 15
echo $add7to(1); // 8

関数の「ソース コード」を検査する方法があるとしたら$add5to、次のようになります。

function($rightNum) {
    return 5 + $rightNum;
}

$leftNumの値はクロージャ関数によって記憶されたと言えると思います。

さらに強調したいのはuse statementreference変数、そして単なるコピーではない価値変数がかつて持っていた値です。私の考えを明確にするために、変数を小さな箱と考えてください。この箱には、いつでも 1 つの値を入れることができ、その値は変更できます。また、別の変数がその箱を指すようにして、箱の中の値を更新したり、現在の値を読み取ったりすることができます。

通常、関数内で作成されたローカル変数は、関数が返された後に存在しなくなります。しかし、クロージャ関数はその変数への参照を維持し、関数が返された後もそのローカル変数を存続させることができます。これがクロージャ関数の真の力です。クロージャ関数を使用すると、ほんの少しのコードで、クラスの特定の動作 (インスタンス変数) を模倣できます。

これはより高度な例ですが、動作の細部を理解するには、深い思考が必要になるかもしれません。

function makeBankAccount() {
    // Each time this makeBankAccount func is called, a new, totally
    // independent local variable named $balance is created.
    $balance = 0;

    // Also, on each call we create 2 new closure functions, $modifyBalance, and $getBalance
    // which will hold a reference to the $balance variable even after makeBankAccount returns.
    $modifyBalance = function($amount) use (&$balance) {
        $balance += $amount;
    };

    $getBalance = function() use (&$balance) {
        return $balance;
    };

    // return both closure functions.
    return ['modifyBalance' => $modifyBalance, 'getBalance' => $getBalance];
}

// Let's prove that bank1 works by adding 5 to the balance by using the first
// function, then using the other function to get the balance
// from the same internal variable.
$bank1 = makeBankAccount();
$bank1['modifyBalance'](5);
echo $bank1['getBalance'](); // 5 - it works.

// Now let's make another bank to prove that it has it's own independent internal $balance variable.
$bank2 = makeBankAccount();
$bank2['modifyBalance'](10);
echo $bank2['getBalance'](); // 10 - as expected. It would have printed 15 if bank2 shared a variable with bank1.

// Let's test bank1 one more time to be sure that bank2 didn't mess with it.
echo $bank1['getBalance'](); // 5 - still 5, as expected.

お気づきかもしれませんが、私は参照演算子 &この例では、参照が理解しにくいことが知られています。まだ参照に慣れていない場合は、参照が理解しにくいことを知っておいてください。ただし、この投稿はそれ自体で大体理解できると思います。

おすすめ記事