【问题标题】:PHP static member not holding valuePHP静态成员不持有价值
【发布时间】:2011-11-05 05:42:05
【问题描述】:

您好,我正在编写的 WordPress 插件有一个奇怪的问题,但这与 WordPress 本身无关,更多的是与 PHP 有关,所以请继续阅读,以便我解释。连接了 WordPress 插件,以便调用 init() 函数...这可行,我可以确认它被调用一次。

class MyClass
{
   static $i=0;

   public static function init()
   {
     self::$i++;
   }

   public static function dosomething()
   {
     echo 'i is = ' . self::$i;
   }
}

当第一次从 Wordpress 中调用 dosomething() 时,没问题。然后我有另一个 ajax-response.php 文件,其中包含上述类并再次调用 dosomething,它打印 i 值 = 1。

问题是通过ajax-response.php脚本调用时的i值又回到0了?

就好像它在完全不同的内存空间中执行并创建一个新程序,这样静态成员变量只在同一个进程之间共享,而不是在多个 Web 线程之间共享。

有什么想法吗?

提前致谢,

克里斯

【问题讨论】:

  • 没错。静态成员的状态在不同的网络服务器请求之间不是持久的。如果您想要这种行为,您需要以另一种方式执行此操作。数据库、缓存、会话、cookie 等等等等。
  • 感谢您的回复和大家的帮助

标签: php static reset


【解决方案1】:

就好像它在完全不同的内存空间中执行并创建一个新程序,这样静态成员变量只在同一个进程之间共享,而不是在多个网络线程之间共享。`

没错! :) 这就是 100% 的工作原理。每个 PHP 请求都是一个新请求,具有自己的内存。 static 关键字不是为解决这个问题而设计的。

如果您想在 Web 应用程序中跨多个进程/请求持久化内容,则需要使用 sessions

【讨论】:

    【解决方案2】:

    Ajax 请求是另一个请求。这就是为什么会有新变量
    您可以使用 session 来存储请求之间的值

    【讨论】:

      【解决方案3】:

      您可能需要对此进行讨论。变量仅存储在当前实例中,因此如果您调用另一个脚本并创建 MyClass 类的实例,其所有属性都将设置为默认值。

      【讨论】:

        【解决方案4】:

        没错,你的变量不会在不同的进程之间保持活跃。每个进程都有自己的变量副本。您在这里有很多选择。

        如果您希望它是短期存储,您可以使用将变量存储在会话中。如果您想无限期地存储它,您应该将它存储在数据库或文件中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-10
          • 1970-01-01
          • 1970-01-01
          • 2012-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-05
          相关资源
          最近更新 更多