设为首页 收藏本站
查看: 395|回复: 0

[经验分享] PHP中static关键字原理的学习研究

[复制链接]

尚未签到

发表于 2015-8-30 09:09:45 | 显示全部楼层 |阅读模式
  看PHP手册的时候发现了下面这样一段代码:
  









1 <?php
2 function Test()
3 {
4 static $count = 0;
5
6 $count++;
7 echo $count;
8 if ($count < 10) {
9 Test();
10 }
11 $count--;
12 }
13 ?>


执行结果如下:

12354678910



这是一个递归的函数,声明的静态变量count记录次数,输出1~10。

我在看的时候有个疑惑,递归调用的时候 static $count = 0; 语句会重复执行,这为什么不会导致count变量被重复赋值呢?带着这个疑问和同事研究了一下,测试用代码如下:









1 <?php
2 echo 'start<br />';
3
4 static $a = 10;
5 echo "$a <br />";
6 unset($GLOBALS['a']);
7 echo "$a <br />";
8
9 static $a = 20;
10 echo "$a <br />";
11 $GLOBALS['a'] = 10;
12 echo "$a <br />";
13
14 static $a = 30;
15 echo "$a <br />";
16 unset($GLOBALS['a']);
17 echo "$a <br />";
18
19 static $a;
20 echo "$a <br />";
21
22 static $a = 40;
23 echo "$a <br />";
24 $a = 100;
25 echo "$a <br />";
26
27 static $a = 50;
28 echo "$a <br />";
29
30 static $a = 4;
31 echo "$a <br />";
32
33 echo 'end <br />';
34
35 exit;
36 ?>





执行结果如下:


  • start
  • 4
  • Notice: Undefined variable: a
  • 4
  • 10
  • 10
  • Notice: Undefined variable: a
  • 10
  • 10
  • 100
  • 100
  • 100
  • end


(结果中关于文件位置的部分已删去。也可以去掉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时成功停止。




可能有理解不正确的地方,欢迎拍砖。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-106166-1-1.html 上篇帖子: lighttpd + php 安装配置记录 下篇帖子: php与asp.net的性能比较
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表