url:http://www.dengwz.com/project/ThinkPHP/Library/Think/Storage/ini_news_parser.class.php 关于PHP的静态变量的注意细节 – PHP研发工程师_小邓PHP博客
小邓博客,一位正在奋斗的PHP开发工程师的学习经历分享!为高效PHP开发而努力奋斗

关于PHP的静态变量的注意细节

PHP dengwz7788 1903℃ 0评论

之前的公司的小兄弟要去面试PHP,他遇到了一道PHP基础面试题,大致内容是如下:

[php]
function test(){
static $a = 0;
$a++;
echo "before unset ".$a."<br/>";
unset($a);
$a = 23;
echo "after unset ".$a."<br/>";
}
test();
test();
test();
[/php]

看到这题的时候,就注意到了stats这个标记了$a。就知道这题不会是第一反应的结果。(结果如下)

PHP运行结果

PHP运行结果

这个$a 值没有因为unset() 函数改变,而是一直在累计!!我知道unset()对应static状态的变量是无效的。我马上查看了手册

unset() 销毁指定的变量。

unset() 在函数中的行为会依赖于想要销毁的变量的类型而有所不同。

如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。

如果在函数中 unset() 一个静态变量,那么在函数内部此静态变量将被销毁。但是,当再次调用此函数时,此静态变量将被复原为上次被销毁之前的值。

其实这样这么理解:

PHP变量关系图

PHP变量关系图

PHP的内存地址跟变量直接就是通过这种方式进行关联的。一般的变量是是通过关联的方式指向对应的地址,而不是真是的值。所以unset()的过程,其实是断了之间的联系,而不是抹掉了内存地址的值。
而static在初始化变量的,仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。

所以才看到之前累加的情况出现。而且静态变量在生命周期内只能赋值一次。

PS:现在这样理解着,等读了源码再回来看看逻辑是否正确

转载请注明:PHP研发工程师_小邓PHP博客 » 关于PHP的静态变量的注意细节

喜欢 (12)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址