
Есть интересная идея реализации некоторого обработчика суперглобальных массивов, на примере суперглобального массива $_REQUEST.
Простой способ получить, обработать, обезопаситься за полученные данных с формы и тп. выглядит:
if (!isset($_REQUEST['var'])) $var = NULL; else $var = $_REQUEST['var']; // перед присваиванием нужно прогнать через фильтр
Ну ясное дело, каждый уважающий себя фреймворк, сделает это красивее, тобишь к примеру отдельный статический метод класса, который можно использовать в любом месте проекта, удобно достав нужное нам значение по имени:
class Request { public static function GetVarRequest( $var ){ if (!isset($_REQUEST[$var])) $var = NULL; else $var = $_REQUEST['var']; // перед присваиванием нужно прогнать через фильтр return $var; } } $var = Request::GetVarRequest('var');
И наконец подходим к сути. Есть такое понятие в PHP как "Переменные переменных" (символические ссылки), что и сподвигнуло меня на это решение. Копипастить описание и примеры нет смысла, кто не знаком сюда.
Как это связано с вышеизложенным? Возможно я придумал велосипед, но всё же. Сразу же приведу кусок рабочего решения:
// будем считать, что данные пришли из формы $_REQUEST[ 'var1' ] = 'VAR1'; $_REQUEST[ 'var2' ] = 'VAR2'; $_REQUEST[ 'var3' ] = 'VAR3'; echo '<pre>'; print_r( $_REQUEST ); echo '</pre>'; $r = $_REQUEST; $k = array_keys( $r ); $c = count( $r ); for ( $i = 0; $i < $c; $i++ ){ $v = $k[ $i ]; $$v = $r[ $k[ $i ] ]; // перед присваиванием нужно прогнать через фильтр } echo '<br />var1 - '.$var1; // вывод: "var1 - VAR1" echo '<br />var2 - '.$var2; // вывод: "var2 - VAR2" echo '<br />var3 - '.$var3; // вывод: "var3 - VAR3"
Более того, это можно проделать со свойствами класса:
class VarsVar { // можно оставить абсолюно пустым } $obj = new VarsVar(); $_REQUEST[ 'var1' ] = 'VAR1'; $_REQUEST[ 'var2' ] = 'VAR2'; $_REQUEST[ 'var3' ] = 'VAR3'; echo '<pre>';print_r($_REQUEST);echo '</pre>'; $r = $_REQUEST; $k = array_keys( $r ); $c = count( $r ); for ( $i = 0; $i < $c; $i++ ){ $v = $k[ $i ]; $obj->$v = $r[ $k[ $i ] ]; } echo '<br />var1 - '.$obj->var1; // вывод: "var1 - VAR1" echo '<br />var2 - '.$obj->var2; // вывод: "var2 - VAR2" echo '<br />var3 - '.$obj->var3; // вывод: "var3 - VAR3"
То есть обрамив это дело в статик функцию, передав в нее объект экземпляра класса (ещё не проверено на 100%), можно производить инициализацию где угодно и когда угодно:
class Request { public static function GetVarRequest( $obj ){ $r = $_REQUEST; $k = array_keys( $r ); $c = count( $r ); for ( $i = 0; $i < $c; $i++ ){ $v = $k[ $i ]; $obj->$v = $r[ $k[ $i ] ]; } } } class VarsVar {} $obj = new VarsVar(); Request::GetVarRequest( $obj ); // В PHP 5 уже не нужно явно передавать объекты или присваивать их по ссылке, это делается автоматически.
Итак, подводим итоги.
Минусы:
- нет защиты (кроме постоянного юза «if(isset($var))...» ) от использования отсутствующих переменных, по причине отсутствия оных в самом $_REQUEST, что в свою очередь повлечёт за собой фатал эрор в скрипте;
Плюсы:
- защита действует, если в классе объявлены используемые свойства;
- полностью автоматизированная инициализация;
- возможность сразу же использовать нужные нам переменные/свойства;
Вывод: универсальный и очень простой способ получения данных из $_REQUEST без лишнего гемора использовать можно, только на свой страх и риск. Если вы уверенны, что данные 100% всегда доходят и в случае использования ООП инициализированы свойства класса, то этот метод как флаг вам в руки=))
Данное решение ещё не прошло испытание боем, так как озарило только сегодня и делюсь с вами. Здесь действует парочка простых правил:
- желательно использовать ООП, тобишь классы с их свойствами;
- имена ключей в $_REQUEST должны совпадать с именами выших свойств класса;
- свойства должны быть public;
И конечно бредовая ремарочка из мира фантазий. Если бы в ядро PHP зашили к примеру такой вид переменных $$$var, обращаясь к которым не выскакивало бы ероров из-за отсутствия их инициализации, а наоборот, сразу же создавались бы такие переменные со значением NULL, то предложенный мною способ работал бы безукаризненно.
