PHP:检查变量是否存在,但也检查变量是否具有等于某物的值

2022-08-30 11:43:05

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

我正在做和认为的不是最好的方法:

if(isset($_GET['myvar']) && $_GET['myvar'] == 'something'):做点什么

我的问题是,存在任何方法可以在不声明变量两次的情况下执行此操作?

这是一个简单的案例,但想象一下,必须比较许多这样的变量。$myvar


答案 1

可悲的是,这是做到这一点的唯一方法。但是有一些处理较大阵列的方法。例如,像这样:

$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));

变量$missing现在包含必需的值列表,但这些值在 $_GET 数组中缺失。您可以使用 $missing 数组向访问者显示消息。

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

$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));
foreach($missing as $m ) {
    $_GET[$m] = null;
}

现在,每个必需的元素至少都有一个默认值。现在,您可以使用 if($_GET['myvar'] == 'something'),而不必担心未设置密钥。

更新

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

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

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

答案 2

从 PHP7 开始,您可以使用空合并运算符来避免双重引用:??

// $_GET['myvar'] isn't set...
echo ($_GET['myvar'] ?? '') == 'hello' ? "hello!\n" : "goodbye!\n";

// $_GET['myvar'] is set but != 'hello'
$_GET['myvar'] = 'farewell';
echo ($_GET['myvar'] ?? '') == 'hello' ? "hello!\n" : "goodbye!\n";

// $_GET['myvar'] is set and == 'hello'
$_GET['myvar'] = 'hello';
echo ($_GET['myvar'] ?? '') == 'hello' ? "hello!\n" : "goodbye!\n";

输出:

goodbye!
goodbye!
hello!

3v4l.org 上的代码演示

通常,表达式

$a ?? $b

等效于

isset($a) ? $a : $b

请注意,在代码示例中,有必要将括号放在周围,因为其优先级高于 ,因此$_GET['myvar'] ?? ''==??

$_GET['myvar'] ?? '' == 'hello'

将评估为:

$_GET['myvar'] ?? ('' == 'hello')

只要设置和“真实”(参见手册),这将是正确的,否则是假的(因为是假的)。$_GET['myvar']'' == 'hello'

3v4l.org 上的优先代码演示


推荐