非常に混乱しており、この質問に対する答えが見つからないようです。明確で簡単な説明があると助かります。
ベストアンサー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 statement
、reference
変数、そして単なるコピーではない価値変数がかつて持っていた値です。私の考えを明確にするために、変数を小さな箱と考えてください。この箱には、いつでも 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.
お気づきかもしれませんが、私は参照演算子 &
この例では、参照が理解しにくいことが知られています。まだ参照に慣れていない場合は、参照が理解しにくいことを知っておいてください。ただし、この投稿はそれ自体で大体理解できると思います。