2011-08-27 67 views
2

嗨,我有一个奇怪的问题,我正在写一个WordPress插件,但这不是关于WordPress本身和更多与PHP有关,所以请阅读,所以我可以解释。 WordPress插件被连接起来,以便init()函数被调用...这个工程我可以确认它被调用一次。PHP静态成员不持有价值

class MyClass 
{ 
    static $i=0; 

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

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

当在Wordpress中第一次使用callinf dosomething()时,它是可以的。然后我有另一个ajax-response.php文件,其中包括上面的类,并再次调用dosomething,它打印i值= 1.

问题是我通过ajax-response.php脚本调用时的值返回为0?

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

任何想法?

由于提前,

克里斯

+0

这是正确的。静态成员的状态在不同的网络服务器请求之间不是持久的。如果你想要这种行为,你需要以另一种方式做到这一点。数据库,缓存,会话,cookies等,等等等等。 – sberry

+0

感谢您的回复和大家的帮助 – g18c

回答

2

它,就好像它是在一个完全不同的存储空间中执行并创建一个新的程序,使得静态成员变量仅相同的处理之间共享,而不是到多个网络线程。'

正是! :)这是100%如何工作。每个PHP请求都是一个新的请求,并有自己的内存。 static关键字不是为解决此问题而设计的。

如果要在Web应用程序中的多个进程/请求中保留内容,则需要使用sessions

1

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

1

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

1

这是正确的,你的变量不会在不同的进程之间保持活动状态。每个进程都有自己的变量副本。你在这里有很多选择。

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