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创建了该变量。