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
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 || ....
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) ....
- 3 回答
- 0 关注
- 119 浏览
添加回答
举报