微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

PHP手册的时候发现了下面这样一段代码
<div class="codetitle"><a style="CURSOR: pointer" data="62241" class="copybut" id="copybut62241" onclick="doCopy('code62241')"> 代码如下:

<div class="codebody" id="code62241">
<?PHP
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
?>

执行结果如下:
这是一个递归的函数,声明的静态变量count记录次数输出1~10。
我在看的时候有个疑惑,递归调用的时候 static $count = 0; 语句会重复执行,这为什么不会导致count变量被重复赋值呢?带着这个疑问和同事研究了一下,测试用代码如下:
<div class="codetitle"><a style="CURSOR: pointer" data="53955" class="copybut" id="copybut53955" onclick="doCopy('code53955')"> 代码如下:
<div class="codebody" id="code53955">
<?PHP
echo 'start
';
static $a = 10;
echo "$a
";
unset($GLOBALS['a']);
echo "$a
";
static $a = 20;
echo "$a
";
$GLOBALS['a'] = 10;
echo "$a
";
static $a = 30;
echo "$a
";
unset($GLOBALS['a']);
echo "$a
";
static $a;
echo "$a
";
static $a = 40;
echo "$a
";
$a = 100;
echo "$a
";
static $a = 50;
echo "$a
";
static $a = 4;
echo "$a
";
echo 'end
';
exit;
?>


<DIV style="LINE-HEIGHT: 1.5; FONT-FAMILY: 宋体,Verdana,Arial,Helvetica,sans-serif"><SPAN style="FONT-FAMILY: Verdana" face="Verdana">执行结果如下:
<SPAN style="LINE-HEIGHT: 1.5; FONT-FAMILY: Verdana">start

<DIV style="LINE-HEIGHT: 1.5; FONT-FAMILY: 宋体,sans-serif">

  1. Notice: Undefined variable: a
  2. Notice: Undefined variable: a
文件位置的部分已删去。也可以去掉echo语句使用zend的debug功能查看,这样结果更清晰)
代码第5行第一次输出PHP在页面初始化的时候分配静态变量的内存,此时使用了同一个变量的最后一次声明的值(这个可以把4改为其他数测试)。代码第7行调用unset函数销毁变量$a,再次输出$a的值时看到未定义变量的提示,说明变量已经被销毁。
输出时,输出结果仍是4而不是20,有两种可能,一个PHP再次初始化了$a的值,另一种是PHP使用了$a被销毁前的值,这个问题在第20行输出的时候解决。第16行$a销毁的时候值为10,第19行声明后输出仍为10。
修改为10,在14行再次声明$a,17行输出认为10。推测为重复声明时PHP还是使用静态变量内存中的值,而不再次赋值。
解决了,即递归调用中的声明没有改变$count的值,所以递归在$count=10时成功停止。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

staticstaticstatic关键字原理

相关推荐