在PHP脚本函数内部创建的局部变量,执行时是存在的,当执行完毕后会在内存里立即删除,再次运行函数时会重新创建。这样的优点是:确保函数每次执行是完整独立的,以免混乱。
但我们有时会想在函数调用时保存上次局部变量执行的结果,以便下次执行时使用,这时就可以用静态变量来实现。
声明一个静态变量只需在函数体中变量前面加入关键字static声明,并初始化一个值,如代码清单1-8所示:
代码清单1-8 使用静态变量
<?php function myFunction() { static $myVariable = 0; }?>
通过一个实例比较静态变量是如何有用的,我们先编写一个自定义函数,它的功能是返回函数被调用的次数。如代码清单1-9所示:
代码清单1-9 函数内值的累加
<?php function createWidget(){ $numWidgets = 0; return++$numWidgets; } echo "Creating some widgets...<br />"; echo createWidget() . " created so far.<br />"; echo createWidget() . " created so far.<br />"; echo createWidget() . " created so far.<br />"; ?>
这段代码执行后结果如下:
Creating some widgets... 1 created so far. 1 created so far. 1 created so far.
我们三次调用createWidget()函数,每一次函数被调用时,内部的$numWidgets变量都会从1开始,而不是每次累加,没有达到想要的预期结果。
而使用静态变量,就可以在每次函数调用时使用它上次运算的值。下面修改一下代码,将局部变量声明为静态变量,如代码清单1-10所示:
代码清单1-10 使用函数内使用静态变量累加
<?php function createWidget(){ static $numWidgets = 0; return ++$numWidgets; } echo "Creating some widgets...<br / >"; echo createWidget() . " created so far.<br / >"; echo createWidget() . " created so far.<br / >"; echo createWidget() . " created so far.<br / >"; ?>
现在,脚本会输出我们预想的结果:
Creating some widgets... 1 created so far. 2 created so far. 3 created so far.
综上所述,静态变量在函数调用时,保存了上次运行的值。当脚本运行完毕退出时,静态变量也会销毁,这一点和全局、局部变量特性相同。