找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1077|回复: 0
打印 上一主题 下一主题

PHP中static关键字原理的学习研究分析

[复制链接]

2487

主题

2487

帖子

7391

积分

论坛元老

Rank: 8Rank: 8

积分
7391
跳转到指定楼层
楼主
发表于 2018-2-14 08:39:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            看PHP手册的时候发现了下面这样一段代码:
[U]复制代码[/U] 代码如下:


执行结果如下:
这是一个递归的函数,声明的静态变量count记录次数,输出1~10。
我在看的时候有个疑惑,递归调用的时候 static $count = 0; 语句会重复执行,这为什么不会导致count变量被重复赋值呢?带着这个疑问和同事研究了一下,测试用代码如下:
[U]复制代码[/U] 代码如下:


执行结果如下:
start
[ol]
4  
[B]Notice[/B]: Undefined variable: a  
4  
10  
10  
[B]Notice[/B]: Undefined variable: a  
10  
10  
100  
100  
100  
end [/ol]
(结果中关于文件位置的部分已删去。也可以去掉echo语句使用zend的debug功能查看,这样结果更清晰)
代码第5行第一次输出$a的值为4,由此推测PHP在页面初始化的时候分配静态变量的内存,此时使用了同一个变量的最后一次声明的值(这个可以把4改为其他数测试)。代码第7行调用unset函数销毁变量$a,再次输出$a的值时看到未定义变量的提示,说明变量已经被销毁。
第10行再次输出时,输出结果仍是4而不是20,有两种可能,一个是php再次初始化了$a的值,另一种是php使用了$a被销毁前的值,这个问题在第20行输出的时候解决。第16行$a销毁的时候值为10,第19行声明后输出仍为10。
第11行将$a的值修改为10,在14行再次声明$a,17行输出认为10。推测为重复声明时php还是使用静态变量内存中的值,而不再次赋值。
至此,手册中发现的问题,大致上已经解决了,即递归调用中的声明没有改变$count的值,所以递归在$count=10时成功停止。
可能有理解不正确的地方,欢迎拍砖。
            
            
您可能感兴趣的文章:
  • 理解PHP5中static和const关键字的区别
  • php面向对象全攻略 (十) final static const关键字的使用
  • php Static关键字实用方法
  • PHP中static关键字以及与self关键字的区别
  • 开启PHP Static 关键字之旅模式
  • php类中的$this,static,final,const,self这几个关键字使用方法
  • php中static和const关键字用法分析
  • 深入理解PHP中的static和yield关键字
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端