Должен ли я использовать суперглобалы PHP или фильтр для получения данных $_GET?

Я действительно ненавижу глобальные переменные - возможно, его программист на С# во мне, но когда я работаю на PHP, я каждый день чищу зубы, когда мне приходится делать что-то вроде этого:

$strUsername = $_GET['username'];

Да, я сильно упрощаю его, и да, да, я все это правильно дезинфицирую. Фактически, для структуры, которую я построил, все суперглобалы захватываются почти в начале выполнения и вводятся зависимой оттуда.

Я просмотрел эту функцию в руководстве PHP (вы действительно каждый день узнаете что-то новое): filter_input_array().

Итак, теперь, технически, я могу сделать это вместо того, чтобы хватать все из GET superglobal:

$GETdata = filter_input_array(INPUT_GET);

.... и т.д. и т.д. и т.д. с другими, такими как POST, REQUEST и т.д. Мой вопрос: следует ли использовать filter_input_array и, таким образом, избегать бича суперглобалов, или есть некоторая причина придерживаться их и забывать об использовании функций filter_input? Что все остальные испытывают с этим?

EDIT: я забыл одно: функции filter_input не работают с любыми модификациями уровня script, которые вы добавляете в суперглобалы, поэтому, если я это сделаю: $_GET['cheese'] = 'puff'; попытка сделать filter_input(INPUT_GET, 'cheese'); позже вернет значение null. Это нормально, так как я зависим от инъекций, но он может поймать кого-то из охраны позже, если они не знают.

Ответ 1

Использование filter_input_array все еще использует суперглобалы, потому что он все еще получает свои данные из одного из суперглобальных массивов.

Нет ничего плохого в получении данных из одного из этих массивов, это действительно единственный способ получить данные на самом деле. Вам просто нужно убедиться, что вы избегаете этого, потому что вы его используете.

htmlentities для html, подготовленная строка для pdo, mysql_real_escape_String для функций mysql_ и т.д.

Ответ 2

Почему глобальные переменные плохие?

Общий аргумент состоит в том, что вы вводите unnesseccary зависимости к внешнему состоянию.

Ваше решение не мешает этому, оно только скрывает его.

Лучшим решением было бы, imho, предоставить $_GET в качестве аргумента, как в

function myController($get) {
   $user = Model::get_user($get['userid']);
   render_view('user.html', $user);
}

myController($_GET)

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

Ответ 3

Я использую суперглобальные гиперссылки PHP, но только на уровне библиотеки в моей Framework. Это структура, в которой все контроллеры имеют доступ к объекту запроса, который, в свою очередь, получает доступ к суперглобалам. Это позволяет вам писать тесты для вашего контроллера, создавая объект mock request, заполненный вашими тестовыми параметрами. Это все о хорошем дизайне OO и хороших шаблонах дизайна.

Доступ к суперглобалам непосредственно повсюду без какой-либо абстракции на месте - это анти-шаблон.

Ответ 4

Я действительно ненавижу эти глобальные переменные. Я бы определенно использовал filter_input_array и использовал массив всякий раз, когда это необходимо. Это решает множество ошибок, связанных с глобальными связями, и мешает вам тратить часы на отладку этих труднодоступных глобальных переменных.

Я думаю, что filter_input_array - это wtg!

Ответ 5

Я не думаю, что кто-то знает отличный ответ:)

Когда-то я его использую, иногда получаю данные точно так же, как $_GET['data'], иногда я даже использую import_request_variables().

В каком-то проекте у меня есть специальный класс, этот процесс POST, GET, REQUEST и сделать что-то вроде этого: POST::getValue('username') или GET::getValue('session_id') или COOKIE::getValue('last_time_seen')...

Ответ 6

Если вам действительно не нравятся суперглобалы, почему бы не написать свою собственную реализацию для очистки, например, класса vB_Input_Cleaner?

http://members.vbulletin.com/api/

Ответ 7

Несколько лет назад было еще хуже, параметр & x = в URL-адресе появился как глобальный $x. Amyway, если вы не используете $_GET, кроме рамки, он не существует.