php-функция для объединения внешних переменных в один объект независимо от GET или POST

StackOverflow https://stackoverflow.com/questions/524413

  •  22-08-2019
  •  | 
  •  

Вопрос

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

Существует ли какое-либо хорошо закодированное дополнение PHP, которое делает именно это?

Это было полезно?

Решение

Вы могли бы использовать $_REQUEST, но имейте в виду , что он содержит содержимое $_GET, $_POST и $_COOKIE, и что наличие (и порядок для целей перезаписи) переменных в этом суперглобале зависит от конфигурации в среде выполнения.

Если это вызывает проблемы, возможно, было бы хорошей идеей создать простую версию, суть которой была бы примерно такой

$requestData = array_merge( $_GET, $_POST );

Затем вы можете каким-то образом обернуть это, возможно, предоставив дополнительную полезную функциональность, напримеравтоматическое применение stripslashes() к значениям, искаженным с помощью magic_quotes, предоставляя значения по умолчанию для отсутствующих переменных и т.д.

Другие советы

Объединение обеих переменных (или использование $_REQUEST или Регистрировать Глобальные значения вместо этого) может привести к сбоям в системе безопасности, поскольку вы не можете определенно определить источник его значений.Поэтому при доступе $_REQUEST['foobar'] вы не можете определить, было ли значение отправлено через URL, текст СООБЩЕНИЯ или файл cookie.Это может сделать ваш скрипт уязвимым для Подделка межсайтовых запросов.

Поэтому я рекомендую вам предпочесть безопасность комфорту и использовать те переменные, из которых вы ожидаете получить свои значения. $_GET для аргументов, которые, как ожидается, будут переданы по URL, $_POST для тех, кто был передан по ПОЧТЕ и $_COOKIE для печенья.

Я бы счел плохой практикой объединять $_GET с $_POST.Они предназначены для совершенно разных целей, и, рассматривая их как равные, вы фактически злоупотребляете протоколом HTTP.Как уже упоминалось, $_REQUEST делает то, что вы хотите, но немного непредсказуем.Вы могли бы легко написать свою собственную глобальную функцию, чтобы сделать то же самое:

function param($name, $default = null) {
  return isset($_POST[$name])
    ? $_POST[$name]
    : (isset($_GET[$name])
      ? $_GET[$name] 
      : $default);
}

Но на самом деле ..это плохая практика.

вы можете использовать глобальную переменную $_REQUEST.он определяется PHP, интерпретируемым по умолчанию, когда ваше приложение выполняется в web sapi (например, CGI или web server module), что имеет место в вашем приложении, когда вы пишете веб-приложения с использованием PHP.$_REQUEST - это ассоциативный массив всех данных в $_GET и $_POST, который определяется по умолчанию.для его использования не требуется никакого расширения / библиотеки.

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

class stGlobal

{

//instance
private static $instance;

//global settings
public $post = '';
public $get = '';
public $files = '';
public $request = '';

private function initialize()
{
    $this->post = $_POST;
    $this->get = $_GET;
    $this->files = $_FILES;
    $this->request = $_REQUEST;
}

public function getInstance()
{
    if (!isset(self::$instance))
    {
        $class = __CLASS__;
        self::$instance = new $class();
        self::$instance->initialize();
    }
    return self::$instance;
}

}

Чтобы использовать его где угодно

$myObj = stGlobal::getInstance();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top