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