PHP-使用isset内部函数不工作。。?

PHP-使用isset内部函数不工作。。?,php,function,Php,Function,我有一个PHP脚本,加载时,首先检查它是否是通过POST加载的,如果不是,则检查GET['id']是否是一个数字 现在我知道我可以这样做: if(isset($_GET['id']) AND isNum($_GET['id'])) { ... } function isNum($data) { $data = sanitize($data); if ( ctype_digit($data) ) { return true; } else {

我有一个PHP脚本,加载时,首先检查它是否是通过POST加载的,如果不是,则检查GET['id']是否是一个数字

现在我知道我可以这样做:

if(isset($_GET['id']) AND isNum($_GET['id'])) { ... }

function isNum($data) {  
    $data = sanitize($data);
    if ( ctype_digit($data) ) {
        return true;
    } else {
        return false;
    }
}
但我想这样做:

if(isNum($_GET['id'])) { ... }

function isNum($data) {  
    if ( isset($data) ) {
        $data = sanitize($data);
        if ( ctype_digit($data) ) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}
当我以这种方式尝试时,如果未设置$\u GET['id'],我会收到未定义索引的警告:id。。。这就像我在函数调用中放入$\u GET['id']后,它会发送一个警告。。。即使我的函数将检查该变量是否已设置


是否有其他方法来完成我想做的事情,或者我必须始终检查isset,然后添加我的其他要求。?

在最初传递索引时,您正在引用未定义的索引。您可以这样做:

$key = 'id';

function foo($id ) {
    if ( isset( $_GET[$id] ) ) { 
    }
}
或者,您可以在函数调用之前执行isset

if ( isset($_GET['id']) && isNum($_GET['id'])) { }
另一个选项是使用临时变量:

$foo = isset( $_GET['id'] ) ? $_GET['id'] : null;
if ( $foo ) { functionCall($foo); }

如果错误报告级别与您无关,您也可以降低它的级别。

这是您想要的,请检查以确保在调用
isNum
之前设置了id:


if(isset($_GET['id']) && isNum($_GET['id'])) {
...
}

我总是包含一些其他语言提供的便利函数:get

function get($needle, $haystack, $return=null) {
    return array_key_exists($needle, $haystack) ? $haystack[$needle] : $return;
}
现在您可以拨打:

if(isNum(get('id', $_GET))) {
    // do something here
}

下面是使用自定义类进行此操作的一种优雅方式:

首先,定义SmartArray类:

class SmartArray extends ArrayObject {
    public static function convert(&$array) {
        $array = new self($array);
    }
    public function offsetGet($index) {
        return $this->offsetExists($index)? parent::offsetGet($index):NULL;
    }
}
然后简单地打电话:

SmartArray::convert($_GET);

现在您的
if(isNum($\u GET['id']){…}
不再抱怨如果$\u GET没有键'id':)

您可以更改
isNum
以通过引用接收参数

<?php

if(isNum($_GET['id'])) { ... }

function isNum(&$data) {
    if (isset($data) ) {
        $data = sanitize($data);
        return ctype_digit($data);
    } else {
        return false;
    }
}

他知道这一点。他也想避免那样!除了您的实际问题之外:您可以只写“return;”:-)而不是“if(){return true;}else{return false;}”,谢谢。简单有效。感谢改进的代码。(设置后进行消毒,返回ctype_digit()…)