如何将未定义的变量传递给没有E_NOTICE错误的函数?

时间:2012-04-12 19:50:27

标签: php

非常简单的问题,如何将未定义的变量传递给没有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]));

希望将来帮助其他人!

4 个答案:

答案 0 :(得分:8)

您有三种选择:

  • 使用isset正确处理逻辑(isset($ x)|| isset($ y)|| isset($ z))
  • 将所有内容包裹在isset()中,然后让你的函数检查是否有任何争论是真的(有点无聊)
  • 使用@来抑制错误(也是bleh)

@的一个例子是:

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,逻辑问题。