1.8 活用静态变量

在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.

综上所述,静态变量在函数调用时,保存了上次运行的值。当脚本运行完毕退出时,静态变量也会销毁,这一点和全局、局部变量特性相同。