Как использовать внешние переменные (например, POST / GET) в PHP с уровнем ошибки E_NOTICE

Я ищу лучший способ использования внешних переменных в PHP с уровнем ошибок, включая E_NOTICE.

У меня есть три возможных пути, я был бы рад, если вы дадите несколько советов по каждому из них или предложите другой подход, который ВАМ понравится.

    1.
class WebApp {

    public static function _GET($Index) {
        if (isset($_GET[$Index])) {
            return $_GET[$Index];
        } else {
            return NULL;
        }
    }
}

// E_NOTICE, does not throw a notice:
echo WebApp::_GET('ID');

// E_NOTICE, throws a notice:
echo $_GET['ID'];

2.

class RequestSanitizer {
    const V_INTEGER = 1;
    const V_STRING = 2;
    const V_REAL = 3;

    public static function Sanitize($arr) {
        foreach ($arr as $key => $val) {
            if (array_key_exists($key, $_GET)) {
                switch ($val) {
                    case RequestSanitizer::V_INTEGER:
                        $_GET[$key] = $_GET[$key] + 0;
                        break;
                    case RequestSanitizer::V_STRING:
                        $_GET[$key] = $_GET[$key] + '';
                        break;
                    case RequestSanitizer::V_REAL:
                        $_GET[$key] = $_GET[$key] + 0;
                        break;
                }
            } else {
                $_GET[$key] = null;
            }
        }
    }
}

RequestSanitizer::Sanitize(array(
    'GraphID' => RequestSanitizer::V_INTEGER,  
    'UserName' => RequestSanitizer::V_STRING,  
    'Password' => RequestSanitizer::V_STRING,  
    'Price' => RequestSanitizer::V_REAL 
));

echo $_GET['GraphID'];

3.

if (isset($_GET['ID']) && ($_GET['ID']+0>0)) {
   echo $_GET['ID']
}

person oneee    schedule 13.10.2009    source источник


Ответы (2)


Я бы использовал класс Request, который инкапсулирует все «суперглобальные» Php и предоставляет такие методы, как «param ()», «numParam ()», «arrayParam ()» и так далее.

$req = new Request();
$user_id = $req->numParam('id');
 // user_id is guaranteed to be a valid integer or 0
person user187291    schedule 13.10.2009
comment
Это очень похоже на мой первый вариант. Я использовал статический метод, поэтому мне не нужно создавать новый класс каждый раз, когда мне нужно его использовать. Мне нравится ваш подход с numParam, arrayParam и т. Д. - person oneee; 13.10.2009

я хотел бы использовать

if (isset($_GET['ID']) && ($_GET['ID']+0>0)) {
   echo (int)$_GET['ID']
}

с приведением к целому числу (int). Если значение должно быть целым числом.

person powtac    schedule 13.10.2009
comment
В этом случае вам необходимо: 1) всегда использовать приведение 2) всегда проверять, установлена ​​ли переменная (isset ($ _ GET ['ID'])) - person oneee; 13.10.2009
comment
Да, и более короткого пути к этому не будет. Если переменная не задана, второе условие выражения выполняться не будет. Но только если он уверен, что значение должно быть целым числом. - person powtac; 13.10.2009
comment
Более короткий путь с классом из варианта 1: echo (int) WebApp :: _ GET ('ID'); - person oneee; 13.10.2009
comment
Но вы не проверяли, установлена ​​ли переменная. Вы получите 0, даже если не было указано никакого значения! - person powtac; 13.10.2009