非常简单的问题,如何将未定义的变量传递给没有E_NOTICE错误的函数?
当将未定义的变量传递给诸如isset()之类的函数时,不会引发错误,而是将其发送到您自己的函数,您将得到一条通知:未定义的偏移量:等等。
我想到了今天想要这个的几个理由,但是我的当前函数几乎是isset的一个克隆,除了它将检查是否设置了任何的args,而不是像isset一样( a,b,c)确实。
function anyset()
{
$argc = func_num_args();
$argv = func_get_args();
for ($i = 0; $i < $argc; $i++)
if (isset($argv[$i])) return true;
else return false;
}
现在,我有一个[x] [y]的巨大二维数组,其值将随机放置。我需要检查随机化的co-ords包含“next”的任何内容(x-1,y-1到x + 1,y + 1)等。
我不想做20,000,000的循环并初始化每个变量。我只想发送9个变量并检查是否已设置。
while (anyset($items[$x-1][$y-1],$items[$x][$y-1],$items[$x+1][$y-1],
$items[$x-1][$y],$items[$x][$y],$items[$x+1][$y],
$items[$x-1][$y+1],$items[$x][$y+1],$items[$x+1][$y+1]));
像这样。
我可以做isset(x)|| isset(x)|| isset(x)但看起来不太好。
有没有办法允许未定义的变量传递给我的函数而不会引发错误?
不想选择简单的选项;)
感谢阅读!
\ o
更新: 2012年4月12日,21:03 看起来没有特殊功能允许这种情况发生。所以要么像anyset一样传递(@ $ array [0],@ $ array [1])等,要么只是将所有内容包装成千个issets:
while (isset($items[$x-1][$y-1]) || isset($items[$x][$y-1]) || isset($items[$x+1][$y-1]) ||
isset($items[$x-1][$y]) || isset($items[$x][$y]) || isset($items[$x+1][$y]) ||
isset($items[$x-1][$y+1]) || isset($items[$x][$y+1]) || isset($items[$x+1][$y+1]));
希望将来帮助其他人!
答案 0 :(得分:8)
您有三种选择:
@的一个例子是:
function a($a) { } a(@$x);
你应该记住,通知存在是有原因的。我避免错误抑制。这对我来说似乎很丑陋。我会正确地将所有内容包装在isset()中。它更冗长,但在我看来,更正确。
答案 1 :(得分:6)
按引用传递将适用于已定义的参数。
function my_isset(&$k) { ... }
$bool = my_isset($_POST['hi']);
答案 2 :(得分:3)
isset
有点特别,因为它实际上是PHP语言结构而不是函数[1]。
如果变量未定义,则无法真正传递它,因为它未定义(因此警告)。
如评论中所述,您可以通过在变量前加@
来抑制警告,这样可以防止在未设置警告时发出警告。然后在函数中,您可以检查该值是否为null或尝试使用isset
来查看它是否已注册。
答案 3 :(得分:-1)
这样的事情对你有用吗?这有点像hackish,但我觉得如果不对函数参数进行惰性求值,你想要的东西是不可能的。
if (atLeastOneIsSet($myArray, 1, 3, 4, 6)) doSomething();
function atLeastOneIsSet(array $arr) {
$args = func_get_args();
for ($i = 1; $i < func_num_args(); ++$i)
if (isset($arr[$args[$i]])) return true;
return false;
}
编辑:oops,逻辑问题。