関数の内部変数が外部参照され、実行後に自動的に削除されないのはなぜですか?
この投稿の最終編集者は baidu_25468825 で、2015-02-02 03:01:59 function counter($d= 0) {
$counter = 1 $d;
return function() use(&$counter) {return $counter ;};
$a = counter();
echo $a(); //1
echo $a(); //2
質問:
$a = counter(); function ; 関数の実行後にすべての内部変数を削除します; ????
ローカル変数のメモリアドレスがどのようにグローバルになるのか理解できません;
echo $a(); 🎜>echo $a(); //2
よくわかりません、詳しく答えてください;
----------
適当に書いたので分析が正しいか分かりませんがよろしくお願いします。修正してアドバイスをください;
<br />function aaa() { <br /> $a =1; <br /> return function() use(&$a) {return $a ++;}; //该$a继承父作用域的$a内存地址;<br /> } <br /> <br /> //首先返回的是一个闭合函数: function() use (&$a) {return $a ++;}<br /> //函数嵌套函数,当外层函数执行时,其内部函数变成全局作用域; <br /> //闭合函数: 拥有 $a内存的控制权;同时又是全局函数; 有点......<br /> <br /> $a = aaa(); //aaa()执行完毕,清空变量,因&引用,ref_count -1 ,不释放内存;<br /> echo $a(); //1;<br /> echo $a(); //2;<br />
ログイン後にコピー
-----解決策のアイデア-------- --------------
何が理解できないのですか?
(
&$counter) を使用するので、当然、その結果を知る必要があります。その & により、ルールが変更されました。
参照なので2 つあり、上記の変数は同じデータ領域を指しており、1 つを削除しても、他の変数はまだ存在します
-----解決策のアイデア----------- --------- -
JS クロージャーは非常に人気がありますが、PHP では非常に少ないようです...
匿名関数を $a に代入した後、グローバル関数の誕生と同等ですが、これは重要ではありません...
使用中の $counter が単なるコピー呼び出しの場合、メモリは $a = $counter();それはたまたまポインタです...だからそのメモリの一部がこの匿名関数に残されています 降りてくださいこの時点で、匿名関数内の$counterは$aにのみ属します $b = counter とすると。 ();、別の独立した $counter
が存在します。