php递归数值类型问题,求高手解答
方法中$aFileArr这个变量如果设置为static类型,浏览器就会卡死,陷入死循环,求解答数值类型之间的区别...
方法中$aFileArr这个变量如果设置为static类型,浏览器就会卡死,陷入死循环,求解答数值类型之间的区别
展开
3个回答
展开全部
哈哈,这个问题让我来给你解答吧。
1:变量$aFileArr不设置成static类型时,他只是函数中的一个局部变量,当函数递归发生时,函数每一次执行都会产生一个名字为$aFileArr的变量,但是他们在内存栈区存在的形式为不同的个体,最终由return返回出去,被上一级的$aFileArr给push。所以不会变为死循环。
2:变量$aFileArr设置成static类型时,变量$aFileArr不在内存栈区存放,而是在静态数据区存放,不管该函数递归多少次,变量都只有一个。当函数执行完成返回该静态变量后,上一级的静态变量将这个静态变量push。而这两个静态变量是同一个变量,当上一级静态变量内容发生变化,他push掉的自己也发生变化,他push掉自己发生变化,那上一级的静态变量又发生变化。就这样进入了死循环。
不知道你看懂了没?
总结:一般变量,函数每次执行都会产生名字相同,但个体各自存在。就如同大袋子装小袋子,虽然都叫做袋子,但是都是独立的个体。
静态变量,函数第一次执行才会产生,以后每次产生都是使用第一次产生的静态变量,不管函数运行多少次,操作的都只有一个静态变量。就如同自己家有一个袋子,每次使用后把这个袋子在放入到这个袋子里面,怎么能放得进去呢?
OK!~~
1:变量$aFileArr不设置成static类型时,他只是函数中的一个局部变量,当函数递归发生时,函数每一次执行都会产生一个名字为$aFileArr的变量,但是他们在内存栈区存在的形式为不同的个体,最终由return返回出去,被上一级的$aFileArr给push。所以不会变为死循环。
2:变量$aFileArr设置成static类型时,变量$aFileArr不在内存栈区存放,而是在静态数据区存放,不管该函数递归多少次,变量都只有一个。当函数执行完成返回该静态变量后,上一级的静态变量将这个静态变量push。而这两个静态变量是同一个变量,当上一级静态变量内容发生变化,他push掉的自己也发生变化,他push掉自己发生变化,那上一级的静态变量又发生变化。就这样进入了死循环。
不知道你看懂了没?
总结:一般变量,函数每次执行都会产生名字相同,但个体各自存在。就如同大袋子装小袋子,虽然都叫做袋子,但是都是独立的个体。
静态变量,函数第一次执行才会产生,以后每次产生都是使用第一次产生的静态变量,不管函数运行多少次,操作的都只有一个静态变量。就如同自己家有一个袋子,每次使用后把这个袋子在放入到这个袋子里面,怎么能放得进去呢?
OK!~~
展开全部
你最后一个递归调用那个,不需要返回值,直接调用
aGetAllFile($folder.'/'.$file);
aGetAllFile($folder.'/'.$file);
追问
其实我的截图是可以运行的,不会卡死,但是只要把那个变量类型改成static他就卡死了,我就是想知道为什么
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
静态变量:当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果;
如果$aFileArr设置为静态变量,每次递归$aFileArr都是前一次执行的结果加上自己的结果在传给下一次递归,在把结果返回,肯定就卡死了。
如果$aFileArr设置为静态变量,每次递归$aFileArr都是前一次执行的结果加上自己的结果在传给下一次递归,在把结果返回,肯定就卡死了。
追问
那更改静态变量,递归返回只是更改值啊,为什么会卡死,麻烦说的详细点,谢谢!我提升悬赏
追答
$aFileArr 设置为静态变量,$aFileArr = array(); 也就没用了,他是前一次执行递归的结果,不会被重新初始化,还要用这个变量返回结果,计算机就彻底凌乱了,他会成几何倍数增长。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询