Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何编写一个函数来检查变量是否已定义且是否为数字?_Php - Fatal编程技术网

Php 如何编写一个函数来检查变量是否已定义且是否为数字?

Php 如何编写一个函数来检查变量是否已定义且是否为数字?,php,Php,在过去,当我需要检查一个变量是否设置为以及一个数字时,我会: if( isset($_GET['var']) && is_numeric($_GET['var']) ) 但我觉得这有点难看,特别是当我需要检查同一if语句中的一组变量时,所以我做了一个函数: function setAndNum($var) { if(isset($var) && is_numeric($var)) return 1; else re

在过去,当我需要检查一个变量是否设置为以及一个数字时,我会:

if( isset($_GET['var']) && is_numeric($_GET['var']) )
但我觉得这有点难看,特别是当我需要检查同一if语句中的一组变量时,所以我做了一个函数:

function setAndNum($var)
{
    if(isset($var) && is_numeric($var))
        return 1;
    else
        return 0;
}
问题是,当我向函数传递一个未定义的变量时,就像这样(假设GET数组中的变量未定义):

我得到了php错误:

注意:未定义的索引:

因此,函数的整个目的基本上是失败的(或者至少是目的的一半)

让我困惑的一件事是isset()函数是如何工作的,以及为什么我可以将未定义的变量传递给它,但不能传递给我自己的函数


可以让我的setAndNum()函数工作吗

您的问题在于
$\u GET
是一个数组。将
$\u GET['var']
传递给函数时,已查找此数组值并将其用作函数的参数。因此,您无法在此函数中有效地检查
$\u GET
中是否存在
'var'
。您可以稍微重写它,使其适用于数组值,如下所示:

function setAndNum($key, $array)
{
    if(array_key_exists($key, $array) && is_numeric($array[$key]))
        return 1;
    else
        return 0;
}
if( setAndNum('var', $_GET) )
那么就这样称呼它:

function setAndNum($key, $array)
{
    if(array_key_exists($key, $array) && is_numeric($array[$key]))
        return 1;
    else
        return 0;
}
if( setAndNum('var', $_GET) )

在使用密钥之前,最好先验证密钥是否存在:

if (array_key_exists($_GET, 'var')) {
  // do stuff with $_GET['var']
}

请尝试使用此版本:

function setAndNum(&$var)
{
    if(isset($var) && is_numeric($var))
        return 1;
    else
        return 0;
}

如果您使用GET或POST方法中的变量,您可以这样做,因为它们是超全局变量

function setAndNum()
{
    if(isset($_GET['var']) && is_numeric($_GET['var']))
        return 1;
    else
        return 0;
}
现在来回答你的另一个问题。isset检查变量是否为SET

if(isset($_POST['submit']))
{
// any code under button click
}

您可以使用
@
操作符来防止错误报告:

setAndNum(@$_GET['var']);

这样,不存在索引的错误消息将不会被打印,返回值将为
0

您还可以编写两个函数,一个用于检查数组,另一个用于检查正态变量

function setAndNum($var)
{
    if(isset($var) && is_numeric($var))
      return 1;
    else
      return 0;
}

function setAndNumArray($array, $key)
{
    if(isset($array) && isset($array[$key]) && is_numeric($array[$key]))
       return 1;
    else
      return 0;
}

答案是正确的,但最好解释它,而不是简单地提供代码。这里的问题是,由于使用引用的性质,如果调用范围中不存在变量,则创建该变量。函数的返回值仍然正确且合乎逻辑,但调用函数会产生副作用。@chris-你能解释一下你提到的“副作用”吗?我试着使用一个参考资料,似乎效果很好。当然<代码>打印\u r($\u GET);setAndNum($_GET['idontexist']);打印(美元);请注意,已创建数组项。原因是php引用指向一个变量,并且不能指向任何地方,因此php创建了该变量。