多个 ISSET OR 条件



isset可用于检查是否设置了多个变量:

if (isset($var1, $var2, $var3)) {...}

但是,如果我想检查是否设置了任何变量怎么办?

if (isset($var1) || isset($var2) || isset($var3)) {...}

鉴于使用@进行错误抑制被认为是不好的做法,有没有比这更好的方法?

function orset()
{
foreach (func_get_args() as $arg) {
if (isset($arg)) return true;
}
return false;
}
if (orset(@$var1, @$var2, @$var3)) {...}

我想出了检查是否设置了任何变量的新想法。但是,这是不可能的,因为 deceze 提到,但这种方式更容易列出您要检查的所有变量。但这仍然不是实现它的非常优雅的方式,因为没有很好的方法可以做到这一点。

解决方案是链接零聚结运算符。在链的末尾返回null很重要,因为其他方式它会显示不存在数组元素的通知。

$var3 = 'test';
$var4['4'] = false;
$var4['3'] = null;
var_dump(!is_null($var1 ?? $var2 ?? $var3 ?? $var4['4'] ?? null)); //true
var_dump(!is_null($var1 ?? $var2 ?? $var3 ?? null)); //true
var_dump(!is_null($var1 ?? $var2 ?? null)); //false
var_dump(!is_null($var1 ?? $var2 ?? $var4['3'] ?? null)); //false
var_dump(!is_null($var1 ?? $var2 ?? $var4['5'] ?? null)); //false

>isset检查变量是否null,同时在禁止显示该变量根本不存在时抑制通知。

没有办法创建一个像isset一样工作的用户定义函数。用户定义的函数只能接受,而不能接受"变量"。该值必须在调用方解析,因此不存在的变量将始终在那里生成通知,并且您的函数无法抑制它。isset是一个"语言结构",它更像是一个运算符而不是一个函数,并且没有办法模仿它在用户空间代码中所做的。在某些特殊情况下,您可能能够实现一些解决方法,例如使用全局变量,但在其他情况下(例如,当您不使用全局变量时(这些解决方法会失败。

从根本上说,你不应该首先处理不存在的变量。你的代码完全控制它创建的变量,所以如果你定义你的变量,那么你不需要检查它们是否存在。任何动态的东西都应该作为数组或对象传递,例如通过$_GET$_POST或其他可以作为对象传递的数据结构的用户输入。那么你不再是在谈论isset,而是在测试数组中键的存在,例如,可以简化,例如:

if (array_intersect_key($array, array_flip(['foo', 'bar', 'baz']))) {
echo 'At least one of those keys was in $array';
}

因此,请避免陷入需要首先检查是否设置了某些变量的情况。如果您不可避免地处于这种情况,那么isset || isset || ...就没有真正的解决方法。

我不完全确定这是否是解决这个问题的最佳方式......您只能将变量名称传递给函数,而不能传递给变量。

//$var1 = 1;
//$var2 = 2;
//$var3 = 3;
function orset()
{
foreach (func_get_args() as $arg) {       
global ${$arg};        
if (isset(${$arg})) {
return true;
}
}
return false;
}
if (orset('var1', 'var2', 'var3')) {
echo "ok"; 
}

为什么要抑制错误?将未定义的变量传递给函数应该会产生通知。 如果你忘记了抑制错误(你应该这样做(,你可以使用:

function orset()
{
foreach (func_get_args() as $arg) {       
global $arg;        
if (isset($arg)) {
return true;
}
}
return false;
}
if (orset($var1, $var2, $var3)) {
echo "ok"; 
}

当您可以简单地使用 if (isset($var 1( || isset($var( ....

最新更新