Я ищу уверенность в том, что статические переменные НЕ хранятся между запросами PHP. Следующие предыдущие вопросы:
Статические переменные PHP на нескольких страницах .php
Сохраняются ли постоянные переменные в php по запросам?
Статические переменные во всех сеансах
ясно говорят, что они не являются, но они больше в контексте предоставления способа сохранить состояние, а не конкретное обсуждение того, что является ожидаемым поведением.
В качестве примера, если у меня есть PHP-код:
function myfunc() { static $a=0; print $a++; } for ($i=0;$i<10;$i++) myfunc();
то я получаю вывод 0123456789 каждый раз, когда я его запускаю. Мой инстинкт / понимание PHP дает мне уверенность, что это должно быть так.
В моих собственных экспериментах я закрыл (preforking) apache до одного ребенка, чтобы убедиться, что переменная не запоминается между запросами. Он не запоминается между запросами, как я ожидал. Но это только один сценарий, в котором работает PHP.
Я ищу:
Ссылка на официальную документацию, которая гласит, что это ожидаемое поведение и не изменится. В соответствующей части документации PHP это не упоминается явно (кроме комментариев).
Или пример того, когда статические переменные запоминаются во всех запросах, таких как веб-серверы или повышающие производительность PHP-фреймворки, которые потенциально не смогут очистить статические переменные, чтобы увеличить скорость между запросами.
PHP не сохраняет состояние приложения между запросами. Во время жизненного цикла приложений PHP приложение выполняется только с каждым запросом. Статические переменные предназначены для сохранения значения переменной в области локальной функции, когда выполнение выходит из области. Нигде в документации не упоминается, что статические переменные предназначены для сохранения ценности в запросах.
Да, вы правы, статические переменные или любые переменные в PHP, за исключением $ _SESSION живет только через один запрос. Но вы можете сделать это, используя $ _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();
Особенность PHP заключается в том, что каждый запрос перезагружает весь PHP-код. Таким образом, статический метод / свойство получает значение по умолчанию для каждого нового запроса.
Подтверждение того факта, что «весь PHP-код перезагружается при каждом запросе», заключается в том, что вы можете найти устойчивый метод, например, для доступа к базе данных, чтобы не создавать новое соединение с вашей БД для каждого запроса (см.: Mysql_pconnect )