2010-02-16 1 views
0

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

  1. Есть ли какой-то способ, чтобы держать объект живой все время, что кто-серфинг на сайте?
  2. Какие существуют альтернативы для моей проблемы ?

Было бы очень полезно иметь пример!

ответ

5

PHP не является сдержанным. Каждая загрузка страницы является одноразовым событием. Вы можете сохранять данные с помощью сеансов или хранить информацию в базе данных.

7

Вы можете использовать Sessions, чтобы сохранить данные, связанные с одним пользователем между различными страницами (цитирую):

Поддержка сессий в PHP состоит из способ сохранить некоторые данные по последующих обращениях.

См. Раздел Session Handling в разделе руководства, для получения дополнительной информации о сеансах.

+0

У меня есть небольшая идея в настоящее время. В моем конструкторе я инициализирую переменные класса, если это первый раз. В противном случае я получаю данные из массива $ _SESSION. Когда вызывается деструктор, я сохраняю данные класса внутри массива $ _SESSION. В некотором смысле, похоже, что ООП нарушается, когда нужно помещать все из объекта в глобальный массив для каждого обновления. $ _SESSION можно получить в любом месте. – Partial

2

PHP-скрипт должен выйти до того, как apache сможет обслуживать страницу, поэтому, если вы действительно этого хотите, вы можете сделать это serialize и сохранить все объекты, которые вы хотите сохранить, и использовать куки-файлы session для отслеживания пользователей

+0

+1: Ницца! Я не знал, что вы можете сделать это на PHP. Итак, я должен сериализовать объект и сохранить его в массиве $ _SESSION? – Partial

+1

Помните, что эти ресурсы не могут быть сериализованы и, следовательно, не могут быть сохранены в сеансе. Например, если объект, который вы храните в сеансе, использует соединение с БД, он исчезнет, ​​когда он снова будет извлечен из сеанса. Но у PHP есть механизм (метод магического класса) для этого: '__wakeup'. Когда объект десериализуется, вызывается '__wakeup'. Таким образом, в этом методе вы можете снова активировать ресурсы. См. Документы о '__wakeup': http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.sleep –

+2

Действительно ли вам нужно сериализовать объекты при их хранении в' $ _SESSION'? Насколько я помню, это было сделано автоматически ... –

2
  1. PHP не statefull каждый запрос новый процесс на сервере

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

вы можете Асесс Sesion используя

$_SESSION['stuff'] = $data; 

, то вы можете использовать свои объекты как $ х = новый DataStore ($ _ SESSION [ 'материал']);

Если данные theres в сеансе будут заполнены объектом из этих данных. В противном случае по умолчанию будет установлен стандартный init.

1

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

HTTP, протокол, используемый для извлечения страниц и других ресурсов с веб-серверов, составляет stateless. Это в основном означает, что один запрос ничего не знает от другого запроса, даже если он пришел от одного и того же пользователя. Подумайте об этом таким образом, когда вы запрашиваете вашу страницу PHP, сценарий запускается, и после того, как он заканчивается, Apache отправляет вам результат. Когда вы снова запрашиваете страницу, она делает то же самое, что и в первый раз, когда вы это сделали.Он без гражданства.

Существуют методы, позволяющие сохранять состояние между запросами (чтобы они не забыли ваши объекты), и они включают такие вещи, как куки или переписывание URL. Но при разработке веб-приложений вы должны иметь в виду апатридность HTTP (и, следовательно, ваш PHP-скрипт).

+0

Чтобы обеспечить некоторую дополнительную ясность, безгражданство HTTP не является проблемой в этом случае. У вас может быть среда с состоянием (например, приложения rails), к которой осуществляется доступ через HTTP-файл без состояния, но он сам по себе, с точки зрения состояния. –

1

SESSIONS хороши, я использую их для хранения состояния объекта в некоторых моих PHP-программах.

Или лучшее решение было бы использовать Flex, поэтому вам не придется беспокоиться о безгосударственном протоколе HTTP ...

+0

Не могли бы вы рассказать мне больше о Flex? – Partial

+0

Adobe Flex в основном похожа на концепцию настоящих фреймворков RIA, таких как Silverlight и JavaFX (я их не запрограммировал, поэтому я не могу дать на них мнение). Приложения Flex записаны в AS3 (для логики - тот же язык, что и Flash) и MXML (для интерфейса). Конечный результат скомпилирован как SWF-файл, который автоматически генерирует HTML для просмотра в браузере. Их также можно запустить на рабочем столе с помощью Air. Это также с открытым исходным кодом, поэтому каждый может программировать в нем. Это просто более полный пакет, чем javascript или jQuery. Я использовал оба, и jQuery не подходит для большого количества данных! – PostCodeism

 Смежные вопросы

  • Нет связанных вопросов^_^