Эта тема на forum.dklab.ru


Engel: Класс для входных параметров
Доброе утро.

Пришла мне в голову мысль о создании класса упрощающего получение и проверку входных параметром, т.е. всю проверку входных переменных возложить на класс. К примеру в скрипте нужно получить номер запрашиваемой страницы ($_GET['p']) я реализовывал это следующим образом:
$pg = (isset($_GET['p'])) ? abs(intval($_GET['p'])) : 1;
intval() - чтобы быть уверенным, что это число,
abs() - всё-таки нас интересует абсолютное значение ("-5" тут никак не удовлетворяет)

Если скрипт получает 1 параметр - то данная комбинация не займёт много времени, но если параметров много, и они не только цифры.
Идея заключалась в том чтобы вместо этой длинной проверки писать короче:
$pg = $input->GetInt('p'); // $input - экземпляр класса
и тут мы уже уверены что $pg содержит числовой номер страницы (или false, если $_GET['p'] не определена)

Класс получился простой, с возможность получения переменных $_GET, $_POST, $_COOKIE + возможность добавлять слеши ( addslashes() ) или убирать их ( stripslashes() );


class Input
{
var $adsl = false; // addslashes
var $stsl = false; // stripslashes

/**
* _GET
*/

function Get($index)
{
return ( isset($_GET[$index]) ) ? $_GET[$index] : false;
}

function GetInt($index, $abs = false)
{
$ret = $this->Get($index);

if($ret === false)
{
return false;
}

$ret = intval($ret);

if( $abs && $ret )
{
$ret = abs($ret);
}

return $ret;
}

function GetString($index)
{
$ret = $this->Get($index);

if($ret === false)
{
return false;
}

$ret = (string) $ret;

if( $this->stsl && get_magic_quotes_gpc() )
{
$ret = stripslashes($ret);
}

if( $this->adsl && !get_magic_quotes_gpc() )
{
$ret = addslashes($ret);
}

return $ret;
}

function GetBool($index)
{
return ( $this->Get($index) === false ) ? false : true;
}


/**
* _POST
*/

function Post($index)
{
return ( isset($_POST[$index]) ) ? $_POST[$index] : false;
}

function PostInt($index, $abs = false)
{
$ret = $this->Post($index);

if($ret === false)
{
return false;
}

$ret = intval($ret);

if( $abs && $ret )
{
$ret = abs($ret);
}

return $ret;
}

function PostString($index)
{
$ret = $this->Post($index);

if($ret === false)
{
return false;
}

$ret = (string) $ret;

if( $this->stsl && get_magic_quotes_gpc() )
{
$ret = stripslashes($ret);
}

if( $this->adsl && !get_magic_quotes_gpc() )
{
$ret = addslashes($ret);
}

return $ret;
}

function PostBool($index)
{
return ( $this->Post($index) === false ) ? false : true;
}


/**
* _COOKIE
*/

function Cookie($index)
{
return ( isset($_COOKIE[$index]) ) ? $_COOKIE[$index] : false;
}

function CookieInt($index, $abs = false)
{
$ret = $this->Cookie($index);

if($ret === false)
{
return false;
}

$ret = intval($ret);

if( $abs && $ret )
{
$ret = abs($ret);
}

return $ret;
}

function CookieString($index)
{
$ret = $this->Cookie($index);

if($ret === false)
{
return false;
}

$ret = (string) $ret;

if( $this->stsl && get_magic_quotes_gpc() )
{
$ret = stripslashes($ret);
}

if( $this->adsl && !get_magic_quotes_gpc() )
{
$ret = addslashes($ret);
}

return $ret;
}

function CookieBool($index)
{
return ( $this->Cookie($index) === false ) ? false : true;
}


/**
* Set param
*/

function SetAdsl($on)
{
$this->adsl = ($on) ? true : false;
}

function SetStsl($on)
{
$this->stsl = ($on) ? true : false;
}
}

пример работы:
$inp = new Input();
$inp->SetAdsl(true);

$p = $inp->GetInt('p', true);
$hl = $inp->GetString('hl');
$bl = $inp->GetBool('b');

echo "\$_GET<br>";
echo "var \$p, value: ". $p ." type: ". gettype($p) ."<br>";
echo "var \$hl, value: ". $hl ." type: ". gettype($hl) ."<br>";
echo ($bl) ? "\$bl - init" : "\$bl - not init";

Был бы очень рад услышать ваше мнение о получившимся классе. Не лишено ли смысла его использование?
Rumata:
Был бы очень рад услышать ваше мнение о получившимся классе
для начала - нормально
но не стоит явно привязываться к источникам данных.
пример - скрипт получает данные как из GET, так и из POST.
как в вашем примере вы инициализируете переменную, например, $p?

Не лишено ли смысла его использование
не лишено там где есть передача множества данных или данных из разных источников

1) откажитесь от явной привязки к GET, POST и COOKIE
2) откажитесь от обработки слешей - это задача формы или шаблона
3) подумайте над реализацией FILES

p.s.
1. есть очень кривое решение на pear.php.net - PEAR::Validate
2. есть некое личное решение, но из-за существования нескольких существенно различных версий я не публикую ни одну из них
Engel:
откажитесь от явной привязки к GET, POST и COOKIE
использовать $_REQUEST? хм... почему бы и нет

откажитесь от обработки слешей - это задача формы или шаблона
я думал что stripslashes тут будет весьма изящным решением

подумайте над реализацией FILES
над этим подумаю...

Эта тема на forum.dklab.ru