Когда и почему следует использовать $ _REQUEST вместо $ _GET / $ _POST / $ _COOKIE?

Вопрос в названии.

И что происходит, когда существуют все 3 из $_GET[foo] , $_POST[foo] и $_COOKIE[foo] exist? Какой из них включен в $_REQUEST?

Я бы сказал, никогда.

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

Если это не так:

$ _GET = неразрушающие действия (сортировка, записи, запросы)

$ _POST = деструктивные действия (удаление, обновление)

$ _COOKIE = тривиальные настройки (предпочтения стилей и т. Д.)

$ _SESSION = нетривиальные настройки (имя пользователя, вход в систему ?, уровни доступа)

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

Также см. http://docs.php.net/manual/en/ini.core.php#ini.request-order о том, как разные источники переменных переписывают друг друга, если есть столкновение имен.

Чтобы ответить на вопрос «что происходит, когда все 3 существуют», ответ «это зависит».

PHP автоматически заполняет $ _REQUEST на основе директивы request_order (или variables_order, если request_order отсутствует) в PHP.INI. По умолчанию обычно используется «GPC», что означает, что сначала загружается GET, затем загружается POST (переписывание GET, если есть столкновение), затем загружаются файлы cookie (переписывание get / post, если есть столкновение). Однако вы можете изменить эту директиву в файле PHP.INI. Например, сменив его на «CPG», сначала загрузит файлы cookie, затем опубликует, а затем получит.

Насколько использовать его? Я повторю настроение «Никогда». Вы уже не доверяете пользователю, так зачем же давать пользователю больше инструментов? Как разработчик, вы должны знать, откуда вы ожидаете получить данные. Все дело в уменьшении площади поверхности атаки.

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

Есть некоторые подводные камни:

  • данные берутся из GET, POST и, наконец, COOKIE. Последнее отменяет первое, поэтому будьте осторожны с этим.
  • Архитектура REST требует отделить семантику POST и GET, в этом случае вы не можете полагаться на $_REQUEST .

Тем не менее, если вы знаете, что делаете, это просто еще один удобный трюк PHP .

Я бы использовал его, если бы захотел быстро обновить var, который может поступать из нескольких источников. EG:

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

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

Я использую POST, когда я не хочу, чтобы люди имели легкий доступ к тому, что передается, и я использую GET, когда я не возражаю против того, чтобы они видели значение в URL-адресе. Обычно я не использую файлы cookie, поскольку я считаю, что SESSION подходит для сохраняющихся значений (хотя правильный реестр – лучший способ его использования).