为了账号安全,请及时绑定邮箱和手机立即绑定

多资产或条件

多资产或条件

PHP
饮歌长啸 2023-05-12 15:12:20
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)) {...}
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

我想出了检查是否设置了任何变量的新想法。然而,正如 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


查看完整回答
反对 回复 2023-05-12
?
潇湘沐

TA贡献1816条经验 获得超6个赞

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 || ....


查看完整回答
反对 回复 2023-05-12
?
温温酱

TA贡献1752条经验 获得超4个赞

我不完全确定这是否是解决此问题的最佳方法......您可以只将变量名传递给函数而不是变量。


//$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($var1) || isset($var) ....


查看完整回答
反对 回复 2023-05-12
  • 3 回答
  • 0 关注
  • 101 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信