Статический член PHP не содержит значения - PullRequest
2 голосов
/ 28 августа 2011

Привет, у меня странная проблема с плагином 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;
   }
}

Когда callinf dosomething () впервые из Wordpress, это нормально. Затем у меня есть другой файл ajax-response.php, который включает в себя вышеупомянутый класс и снова вызывает dosomething, который печатает значение i = 1.

Проблема в том, что значение i при вызове через скрипт ajax-response.php возвращается к 0?

Это похоже на то, как если бы он выполнялся в совершенно другом пространстве памяти и создавал новую программу, так что статические переменные-члены совместно используются только одним процессом, а не несколькими веб-потоками.

Есть идеи?

Заранее спасибо,

Chris

Ответы [ 4 ]

2 голосов
/ 28 августа 2011

Это похоже на то, как если бы он выполнялся в совершенно другом пространстве памяти и создавал новую программу, так что статические переменные-члены совместно используются только одним и тем же процессом, а не несколькими веб-потоками .`

Точно! :) Это 100%, как это работает. Каждый PHP-запрос является новым, со своей собственной памятью. Ключевое слово static не предназначено для обхода этого.

Если вы хотите сохранить материал в нескольких процессах / запросах в веб-приложении, вам нужно использовать сеансов .

1 голос
/ 28 августа 2011

Это верно, ваши переменные не будут активными между различными процессами. Каждый процесс имеет свою собственную копию переменной. У вас есть много вариантов здесь.

Вы можете использовать переменную store в сеансе, если хотите, чтобы она была кратковременной. Если вы хотите хранить его неограниченное время, вы должны хранить его в базе данных или файле.

1 голос
/ 28 августа 2011

Вам могут понадобиться сеансы на этом. Переменные хранятся только в текущем экземпляре, поэтому, если вы вызовете другой скрипт и создадите экземпляр класса MyClass, все его свойства будут установлены по умолчанию.

1 голос
/ 28 августа 2011

Ajax-запрос - это еще один запрос. Вот почему есть новые переменные
Вы можете использовать сессию для хранения значений между запросами

...