通过引用访问GET和POST

时间:2010-08-04 01:39:36

标签: php pass-by-reference

我在stackoverflow上学习了如何通过引用访问另一个答案,但是无法再找到它。无论如何,以下方法是不安全还是根本不可靠?

protected function checkVar($requestType, $varname, $checkIfNumber = false)
{
    switch($requestType)
    {
        case 'GET':
            $sg = &$_GET;
            break;
        case 'POST':
            $sg = &$_POST;
            break;
        default:
            throw new Exception('Variable `$requestType` is not `GET` or `POST` in AController::checkVar().');
    }

    if(!isset($sg[$varname])) {
        throw new Exception("$requestType variable [$varname] is not set in AController::checkVar().");
    } else if(empty($sg[$varname])) {
        throw new Exception("$requestType variable [$varname] is empty in AController::checkVar().");
    } else  if($checkIfNumber) {
        if(!ctype_digit($sg[$varname])) {
            throw new Exception("$requestType variable [$varname] is not a number in AController::checkVar().");
        }
    }   

    return $sg[$varname];
}

2 个答案:

答案 0 :(得分:3)

这不是你应该如何使用引用。只要值没有改变,“复制”操作实际上更便宜,并且这里不需要引用(特别是因为您没有通过引用返回,而是实际复制)。在代码的这一点上唯一可以引用的是引起后面的模糊错误,这很容易被追踪。

答案 1 :(得分:2)

这就是我们拥有$_REQUEST超全球的原因。

protected function checkVar($varname, $checkIfNumber = false)
{
    if(!isset($_REQUEST[$varname])) {
        throw new Exception("variable [$varname] is not set in AController::checkVar().");
    } else if(empty($_REQUEST[$varname])) {
        throw new Exception("variable [$varname] is empty in AController::checkVar().");
    } else  if($checkIfNumber) {
        if(!ctype_digit($_REQUEST[$varname])) {
            throw new Exception("variable [$varname] is not a number in AController::checkVar().");
        }
    }   

    return $_REQUEST[$varname];
}

我知道这不是严格相同的事情,但恕我直言,这已经足够了。