php-функция для объединения внешних переменных в один объект независимо от GET или POST
-
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();