2011-08-27 30 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

這是正確的,你的變量不會在不同的進程之間保持活動狀態。每個進程都有自己的變量副本。你在這裏有很多選擇。

如果您希望它是短期存儲,您可以將該變量存儲在會話中。如果您想無限期地存儲它,您應該將其存儲在數據庫或文件中。