Вопросы о сфере действия в PHP - с точки зрения программиста на Java - PullRequest
3 голосов
/ 17 января 2011

Я все еще довольно новичок в PHP и поэтому пытаюсь понять концепцию области видимости в веб-приложениях PHP.

В мире Java веб-приложение Java - с использованием Java Server Pages (JSP) и выше- разрешит Java Bean иметь следующие уровни области действия:

  • Страница
  • Запрос
  • Сеанс
  • Приложение

Попытка сопоставить их с возможностями видимости PHP:

  • Страница: не совсем, но объекты, которые являются локальными для вызова, считаются пропавшими после вызова функции, так что это похоже наобласть страницы
  • Запрос: сделан с использованием суперглобального $ _REQUEST (не уверен, куда это идет ... Файлы cookie? Скрытые поля? Параметры URL?)
  • Сессия: использование PHP $ _SESSIONсупер глобальный (где некоторые из документации и отзывов на форуме утверждают, что это не лучшее место для размещения конфиденциальной информации из соображений безопасности)
  • Приложение: использование PHP APC (ссылка переполнения стека)

Я полностью обедаю или они достаточно похожи?Я знаю, что одним из основных отличий является архитектура PHP ["Shared Nothing"] [5] по сравнению с архитектурой Java, которая позволяет делиться информацией.

Любые исправления из советов / указаний / отрезвляющих средств приветствуются.

Ответы [ 2 ]

5 голосов
/ 17 января 2011

Вы на правильном пути.PHP на самом деле ничего не делит.

В веб-контексте приложение php полностью запускается один раз для каждого HTTP-запроса.Это означает, что для каждого HTTP-запроса интерпретатор читает, анализирует и выполняет сценарий (это упрощается - использование кэша кода операции, например, APC снимает накладные расходы на чтение / анализ). суперглобальные , такие как $ _REQUEST и $ _SESSION.Суперглобальные переменные отличаются от обычных глобальных переменных тем, что они автоматически доступны в каждой области, поэтому нет необходимости использовать ключевое слово global.

Все данные, которые сохраняются между запросами, должны храниться извне.Чтобы обмениваться данными между запросами на поддержание состояния для пользователя, вы обычно используете $ _SESSION, который по умолчанию сериализуется и записывается в файлы на диске (но может быть настроен для использования кэша памяти или базы данных).Данные, которые должны быть разделены между сеансами (что, я полагаю, похоже на область применения в мире JSP), должны храниться где-то снаружи.Вы можете использовать кэш памяти, такой как APC или memcache, или записывать плоские файлы на диск, или вставлять файлы в базу данных, или использовать любую другую схему, которую вы можете придумать.В конце концов, нет ничего встроенного.

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

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

Этот материал, и многое другое, довольно хорошо освещен в руководстве .

1 голос
/ 17 января 2011

Вам, вероятно, стоит взглянуть на это:

http://php.net/manual/en/language.variables.scope.php

У вас есть локальная и глобальная область видимости, суперглобальные переменные, статические переменные. И на этой странице объясняется, как работает каждый из них.

...