确认PHP静态变量不会在请求中保持不变

时间:2011-05-19 16:58:14

标签: php

我正在寻找保证静态变量不存储在PHP请求之间。以下问题:

PHP static variables across multiple .php pages

Does static variables in php persist across the requests?

Static variables across sessions

明确表示他们不是,但他们更多的是提供维持状态的方式,而不是对预期行为的具体讨论。

例如,如果我有如下PHP代码:

function myfunc()
{
    static $a=0;
    print $a++;
}

for ($i=0;$i<10;$i++) myfunc();

然后每次运行它都会得到0123456789的输出。我对PHP的直觉/理解使我非常确定必须如此。

在我自己的实验中,我已经将一个(preforking)apache关闭到一个子节点,以确保在请求之间不记住该变量。正如我所料,请求之间不会记住它。但这只是PHP运行的一种情况。

我正在寻找的是:

指向官方文档的链接,指出这是预期的行为,不会改变。 PHP documentation的相关部分没有明确提及(除了评论中)。

或者,在诸如Web服务器或性能增强的PHP框架之类的请求中记住静态变量的示例,这些变量可能无法清除静态变量以提高请求之间的速度。

3 个答案:

答案 0 :(得分:7)

PHP不保留请求之间的应用程序状态。在PHP应用程序生命周期中,每个请求都会刷新应用程序。静态变量用于在执行离开作用域时保留变量在本地函数作用域中的值。文档中没有提到静态变量是为了保持请求之间的价值。

答案 1 :(得分:3)

是的,你是对的,静态变量或PHP中的任何变量,除了$ _SESSION只能通过一个请求生存。但你可以使用$ _SESSION;

来做到这一点
class MyClass
{
   public static $a = 0;
   public static init()
   {
      self::$a = isset($_SESSION['a']) ? $_SESSION['a'] : 0;
   }
   public static printA()
   {
      self::increaseA();
      print(self::$a);
   }
   public static increaseA()
   {
     self::$a++;
     $_SESSION['a'] = self::$a;
   }
}
myClass::init();
for ($i=0;$i<10;$i++) myClass::printA();

答案 2 :(得分:2)

PHP的特殊性在于每个请求都会重新加载整个PHP代码。因此,静态方法/属性在每个新请求时都会获得它的默认值。

确认“每次请求都重新加载整个php代码”的事实是,您可以找到与数据库访问类似的持久性方法,以避免为每个请求建立与数据库的新连接(请参阅: mysql_pconnect