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

2015-01-24信息快讯网

PHP中static关键字原理的学习研究分析,学习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; 
?> 

执行结果如下:
start
  1. Notice: Undefined variable: a 
  2. 10 
  3. 10 
  4. Notice: Undefined variable: a 
  5. 10 
  6. 10 
  7. 100 
  8. 100 
  9. 100 
  10. 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下使用CURL方式POST数据至API接口的代码
PHP中header和session_start前不能有输出原因分析
Could not load type System.ServiceModel.Activation.HttpModule解决办法
php获取通过http协议post提交过来xml数据及解析xml
PHP提示Notice: Undefined variable的解决办法
Zend Studio去除编辑器的语法警告设置方法
PHP 之Section与Cookie使用总结
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
PHP setTime 设置当前时间的代码
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
php学习之function的用法
php 函数中使用static的说明
Notice: Trying to get property of non-object problem(PHP)解决办法
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
PHP类的静态(static)方法和静态(static)变量使用介绍
php URL验证正则表达式
在WAMP环境下搭建ZendDebugger php调试工具的方法
php max_execution_time执行时间问题
ajax 的post方法实例(带循环)
PHP array_multisort()函数的使用札记
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
php设计模式 Delegation(委托模式)
php设计模式 Strategy(策略模式)
php设计模式 State (状态模式)
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
php中session_unset与session_destroy的区别分析
深入理解PHP原理之Session Gc的一个小概率Notice
用php的ob_start来生成静态页面的方法分析
Notice: Undefined index: page in E:\PHP\test.php on line 14
PHP类中Static方法效率测试代码
php Notice: Undefined index 错误提示解决方法
php中static静态变量的使用方法详解
php Static关键字实用方法
©2014-2024 dbsqp.com