PHP静态变量在请求之间不会保持不变的确认

9
我希望您能确认静态变量不会在 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运行的其中一种情况。
我正在寻找的是:
1. 一个官方文档链接,说明这是预期行为,不会更改。相关的PHP documentation没有明确提到这一点(除了评论)。 2. 或者,一个例子,说明静态变量会在请求之间被记住,例如Web服务器或性能增强的PHP框架,这些框架可能不会清除静态变量以增加请求之间的速度。
3个回答

7

PHP不能在请求之间保留应用程序状态。在PHP应用程序的生命周期中,每个请求都需要重新执行应用程序。静态变量旨在在本地函数范围内保留变量的值,当执行离开该范围时。文档中没有提到静态变量旨在跨请求保留值。


在 PHP 的早期版本中,广泛使用了“register globals”功能...但这已经被弃用了,正确的决定是使用会话。 - Felipe Cardoso Martins
3
@FelipeCardosoMartins,“register_globals”与此无关,从来没有任何关联。 - Brad

3

是的,你说得对,静态变量或除了 $_SESSION 以外的任何 PHP 变量只在一个请求中存在。但是你可以使用 $_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();

嗨Senad,如果在同一个PHP脚本的结尾没有销毁SESSION,那么SESSION变量会在多个AJAX请求中保持不变吗? - Rahul Patwa
1
是的,无论您如何访问服务器,会话都会存在。AJAX只是在不重新加载页面的情况下访问服务器的不同方式。 - Senad Meškin

2
PHP的特殊之处在于每个请求都会重新加载整个PHP代码。因此,静态方法/属性在每个新请求中都会获得其默认值。
“整个php代码在每个请求中重新加载”的证实是,您可以找到持久性方法,例如用于数据库访问,以避免为每个请求创建新连接(请参见:mysql_pconnect)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接