Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Variables_If Statement_Isset - Fatal编程技术网

PHP:检查变量是否存在,以及是否有等于某个值的值

PHP:检查变量是否存在,以及是否有等于某个值的值,php,variables,if-statement,isset,Php,Variables,If Statement,Isset,我有(或没有)一个来自查询字符串的变量$\u GET['myvar'],我想检查该变量是否存在,以及该值是否对应于if语句中的某个内容: 我正在做和思考的并不是最好的方式: if(设置($\u GET['myvar'])&&&$\u GET['myvar']=='something'):做点什么 我的问题是,有没有办法不用两次声明变量就可以做到这一点 这是一个简单的例子,但想象一下,我们必须比较许多$myvar变量 !isset($_REQUEST[$key]) ? $_REQUEST[$key

我有(或没有)一个来自查询字符串的变量
$\u GET['myvar']
,我想检查该变量是否存在,以及该值是否对应于if语句中的某个内容:

我正在做和思考的并不是最好的方式:

if(设置($\u GET['myvar'])&&&$\u GET['myvar']=='something')
:做点什么

我的问题是,有没有办法不用两次声明变量就可以做到这一点

这是一个简单的例子,但想象一下,我们必须比较许多
$myvar
变量

!isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0; 我的问题是,有没有办法不用两次声明变量就可以做到这一点

不,如果不进行两次检查,就无法正确执行此操作


解决这个问题的一种方法是在一个中心点将所有相关的GET变量导入某种数组或对象(大多数MVC框架会自动这样做)并设置以后需要的所有属性。(而不是通过代码访问请求变量。)

遗憾的是,这是唯一的方法。但是有一些方法可以处理较大的阵列。例如这样的事情:

$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));
变量$missing现在包含所需的值列表,但是$\u GET数组中缺少这些值。您可以使用$missing数组向访问者显示消息

或者你可以使用类似的东西:

$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));
foreach($missing as $m ) {
    $_GET[$m] = null;
}
现在,每个必需元素至少有一个默认值。您现在可以使用if($\u GET['myvar']=='something'),而不用担心键没有设置

更新

清理代码的另一种方法是使用一个函数来检查是否设置了值

function getValue($key) {
    if (!isset($_GET[$key])) {
        return false;
    }
    return $_GET[$key];
}

if (getValue('myvar') == 'something') {
    // Do something
}

嗯,如果($\u get['myvar']='something')这个条件假设变量也存在,那么您就可以通过
了。否则,表达式也将导致
false


我认为在上面的条件语句中这样做是可以的。真的没有造成伤害。

谢谢梅卢森和佩卡,我在这里做了一些研究,得出了以下结论:

  • 在开始使用(根据建议)之前,检查每个变量并将其声明为null(如果是):
!isset($_GET['myvar'])$_获取['myvar']=0:0; *好的,这个很简单,但是很好用,你可以开始在这行后面的任何地方使用这个变量

  • 使用数组覆盖所有情况:
$myvars=数组('var1','var2','var3'); foreach($myvars作为$key) !isset($\u GET[$key])$_获取[$key]=0:0; *之后,您可以自由使用变量(var1、var2、var3…等等)

PS:接收JSON对象的函数应该更好(或者一个带分隔符的简单字符串,用于分解/内爆)

。。。欢迎采用更好的方法:)


更新:

使用$\u-REQUEST而不是$\u-GET,这样可以同时包含$\u-GET和$\u-POST变量

!isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0; !isset($\u请求[$key])$_请求[$key]=0:0;
为什么不创建一个函数来执行此操作,将您要检查的变量转换为实变量,例如

function _FX($name) { 
  if (isset($$name)) return $$name;
  else return null; 
}

那么你就做了 > fx(‘PARAM’)=‘123’< /COD>,只是一个想法

< P>正如MyLoWoMy建议的,你可以考虑这个方法:

required = array('myvar' => "defaultValue1", 'foo' => "value2", 'bar' => "value3", 'baz' => "value4");
$missing = array_diff($required, array_keys($_GET));
foreach($missing as $key => $default  ) {
    $_GET[$key] = $default  ;
}

您输入默认值,并将未接收的参数设置为默认值:)

我使用所有时间自己的有用函数exst(),该函数自动声明变量

!isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0; 范例-

$element1 = exst($arr["key1"]);
$val2 = exst($_POST["key2"], 'novalue');


/** 
 * Function exst() - Checks if the variable has been set 
 * (copy/paste it in any place of your code)
 * 
 * If the variable is set and not empty returns the variable (no transformation)
 * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var
 * @param  mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = "";
    if ( !isset($var)  || !$var ) {
        if (isset($default) && $default != "") $t = $default;
    }
    else  {  
        $t = $var;
    }
    if (is_string($t)) $t = trim($t);
    return $t;
}

我在游戏中发现的一个解决方案是:

if($x=&$_GET["myvar"] == "something")
{
    // do stuff with $x
}

没有官方参考,但在我尝试以下方法时,它起了作用:

if (isset($_GET['myvar']) == 'something')

这与公认的答案类似,但在数组中使用
。在这种情况下,我更喜欢使用
empty()
。我还建议使用新的速记数组声明,该声明在+

下面是一个用于同时检查多个值的函数

$arrKeys = array_keys($_GET);
$allowed = ["something","nothing"];

function checkGet($arrKeys,$allowed) { 
    foreach($arrKeys as $key ) {
        if(in_array($_GET[$key],$allowed)) {
            $values[$key];
        }
    }
    return $values;
}

如果您正在寻找一个单行程序来检查一个变量的值,但您不确定该变量是否已设置,则此操作有效:

if ((isset($variable) ? $variable : null) == $value) { }

唯一可能的缺点是,如果您正在测试
true
/
false
-
null
将被解释为等于
false

从PHP7开始,您可以使用
??
来避免双重引用:

$_GET['myvar'] = 'hello';
if (($_GET['myvar'] ?? '') == 'hello') {
    echo "hello!";
}
输出:

hello!
一般来说

$a ?? $b
相当于

isset($a) ? $a : $b

只需定义所有变量。这就是所有这些乱七八糟的问题所在。谢谢你,佩卡,这样做真的很无聊。有时候在一个大系统中很难预测变量何时会出现,这就是为什么声明变量可能没有帮助。但是你在大多数情况下都是对的。@Mariz我不同意:预测变量何时出现应该从来都不难:如果是这样,你的代码就不好。Pekka这是“理想的”,但在一个匆忙的世界里,来自不同背景的人在同一个项目中工作,这很难做到。无论如何,Thancing people.PHP对此没有解决方案,但它是一种编程语言。您可以(而且应该)总是编写一个子程序来缩短重复代码。更不用说,在一个好的程序中,每个变量都应该在使用前定义好……我在那里看到了这一点,只是希望不使用数组也能实现,谢谢。更新了我的答案,展示了一种不使用另一个数组就可以实现这一点的方法。请向上投票下面提到
($var???'value')
的答案。多亏了PHP7,这是现在最简洁的方法。如果myvar索引不存在,它会触发一个通知。是的,但您只是在测试该索引。我想,如果那个条款根本不存在的话,情况只会非常糟糕。我可以接受的通知。毕竟,这只是一个通知,根据定义,它是无害的(通常)。哦,我完全不同意。如果您的目标是创建一个草率的PHP代码库,其中充满了鬼鬼祟祟/无声的bug,那么忽略通知将是一个很好的开始。您应该始终在打开通知的情况下进行开发,并且应该始终将它们视为要修复的bug。不幸的是,如果数组键不存在,则会触发PHP通知,不是吗?不。这是
$a ?? $b
isset($a) ? $a : $b