函数的内部变量,为什么会在外部被引用,不是执行完毕自动删除

WBOY
풀어 주다: 2016-06-13 12:14:52
원래의
1003명이 탐색했습니다.

函数的内部变量,为何会在外部被引用,不是执行完毕自动删除?

本帖最后由 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();   //返回闭合函数;  函数执行完毕删除所有内部变量;
                          ref=2? 好吧等于2; 删除一个; 还有一次引用;
                           函数内部的变量是局域的,内存地址可以公开使用??????????
                          搞不明白,局部变量的内存地址怎么可以变成全局的;
echo $a();    //1   
echo $a();    //2  

我不太理解,请详细的回答下;研究了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 /> 
로그인 후 복사


我乱写的,也不知道分析的对不对,请修正指教;
------解决思路----------------------
用什么不理解的?
既然你 use(&$counter) 那当然是要知道这么做的后果的,因为那个 & ,规则就发生了变化

既然是引用,就是两个及以上变量指向同一数据区,删除一个,其他的还在
------解决思路----------------------
js的闭包挺流行,但貌似php很少...
匿名函数赋给$a后,等价于诞生了一个全局函数,但这不是重点...
use中的$counter如果只是拷贝调用,在$a = $counter();的赋值过后,内存也就释放了
偏偏是指针...所以那块内存在这个匿名函数中留了下来
此时匿名函数中的$counter只属于$a,如果你再令$b = counter();,会有另一个独立的$counter
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿