PHP中static关键字原理的学习研究分析
程序员文章站
2024-01-30 17:31:04
看php手册的时候发现了下面这样一段代码: 复制代码 代码如下:
看php手册的时候发现了下面这样一段代码:
<?php
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
?>
执行结果如下:
这是一个递归的函数,声明的静态变量count记录次数,输出1~10。
我在看的时候有个疑惑,递归调用的时候 static $count = 0; 语句会重复执行,这为什么不会导致count变量被重复赋值呢?带着这个疑问和同事研究了一下,测试用代码如下:
<?php
echo 'start<br />';
static $a = 10;
echo "$a <br />";
unset($globals['a']);
echo "$a <br />";
static $a = 20;
echo "$a <br />";
$globals['a'] = 10;
echo "$a <br />";
static $a = 30;
echo "$a <br />";
unset($globals['a']);
echo "$a <br />";
static $a;
echo "$a <br />";
static $a = 40;
echo "$a <br />";
$a = 100;
echo "$a <br />";
static $a = 50;
echo "$a <br />";
static $a = 4;
echo "$a <br />";
echo 'end <br />';
exit;
?>
复制代码 代码如下:
<?php
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
?>
执行结果如下:
这是一个递归的函数,声明的静态变量count记录次数,输出1~10。
我在看的时候有个疑惑,递归调用的时候 static $count = 0; 语句会重复执行,这为什么不会导致count变量被重复赋值呢?带着这个疑问和同事研究了一下,测试用代码如下:
复制代码 代码如下:
<?php
echo 'start<br />';
static $a = 10;
echo "$a <br />";
unset($globals['a']);
echo "$a <br />";
static $a = 20;
echo "$a <br />";
$globals['a'] = 10;
echo "$a <br />";
static $a = 30;
echo "$a <br />";
unset($globals['a']);
echo "$a <br />";
static $a;
echo "$a <br />";
static $a = 40;
echo "$a <br />";
$a = 100;
echo "$a <br />";
static $a = 50;
echo "$a <br />";
static $a = 4;
echo "$a <br />";
echo 'end <br />';
exit;
?>
执行结果如下:
start
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时成功停止。
可能有理解不正确的地方,欢迎拍砖。
推荐阅读
-
php面向对象中static静态属性与方法的内存位置分析,面向对象static
-
PHP中static关键字以及与self关键字的区别_PHP
-
php类中的$this,static,final,const,self这几个关键字使用方法_php实例
-
PHP中static关键字以及与self关键字的区别_PHP教程
-
php中在变量和函数前加static关键字之后的区别
-
PHP中new static()与new self()的区别异同分析_php技巧
-
php类中的$this,static,final,const,self这几个关键字使用方法_php实例
-
PHP中new static()与new self()的区别异同分析
-
PHP中new static()与new self()的区别异同分析_PHP
-
PHP中new static()与new self()的区别异同分析