Сохраняются ли статические переменные в php в запросах? - PullRequest
34 голосов
/ 06 февраля 2009

Статическая переменная Гоча в php

Я из Java и недавно переключился на php для одного проекта. Я нашел одно неожиданное поведение в php.

Значение, установленное для некоторой статической переменной: не остается постоянным по запросы.

Я не уверен, что это ожидаемое поведение. Потому что в Java вы всегда можете сохранять очень часто используемые переменные или произносить константы, такие как dbname, hostname, username, password, в запросах, чтобы вам не приходилось всегда читать их из локальных файлов свойств.

Это нормальное поведение? И если это нормально, то есть ли альтернатива, с помощью которой я могу сохранить значения, назначенные переменным в запросах?

Может кто-нибудь предложить мне лучший способ сделать это в php?

Ответы [ 3 ]

20 голосов
/ 06 февраля 2009

Нет, в то время как статическая переменная останется для текущего запроса, вам нужно добавить ее в сеанс, чтобы сохранить значение в запросах.

Пример:

session_start();

class Car {
    public static $make;
    public function __construct($make) {
        self::$make = $make;
    }
}

$c = new Car('Bugatti');
echo '<p>' . Car::$make . '</p>';
unset($c);

if (!isset($_SESSION['make'])) {
    echo '<p>' . Car::$make . '</p>';
    $c = new Car('Ferrari');
    echo '<p>' . Car::$make . '</p>';
}

$_SESSION['make'] = Car::$make;

echo '<p>' . $_SESSION['make'] . '</p>';
3 голосов
/ 06 февраля 2009

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

Хороший стартовый ролик для них находится здесь: http://www.tizag.com/phpT/phpsessions.php

2 голосов
/ 06 февраля 2009

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

Переменные в PHP не должны быть постоянными. Поток вашего приложения (стека) выполняется от начала до конца при каждом запуске страницы. На заднем плане нет ничего, что продолжало бы вашу логику или приложение. Самым близким является сеанс, но вы не хотите хранить там информацию, такую ​​как доступ к базе данных и т. Д.

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

...