13

非常简单的问题,如何将未定义的变量传递给没有 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] 二维数组,其中的值将被随机放置。我需要检查随机坐标是否包含“旁边”的任何内容(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

4 回答 4

10

通过引用传递将适用于已定义的参数。

function my_isset(&$k) { ... }

$bool = my_isset($_POST['hi']);
于 2012-04-12T19:58:31.267 回答
10

你有三个选择:

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

@ 的一个例子是:

function a($a) { } a(@$x);

您应该记住,通知的存在是有原因的。我避免错误抑制。这对我来说似乎很hacky。我会正确地将所有内容包装在 isset() 中。它更冗长,但无论如何,在我看来,更正确。

于 2012-04-12T19:54:09.140 回答
5

isset有点特别,因为它实际上是 PHP 语言结构而不是函数[1]

如果变量未定义,则无法真正传递它,因为它未定义(因此出现警告)。

如评论中所述,您可以通过@在变量前面加上一个来抑制警告,这将防止在未设置的情况下发出警告。然后在函数中,您可以检查该值是否为 null 或尝试使用isset它来查看它是否已注册。

于 2012-04-12T19:56:43.163 回答
-1

也许这样的事情会为你工作?这有点骇人听闻,但我认为如果没有对函数参数的惰性求值,你想要的不太可能。

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;
}

编辑:哎呀,逻辑问题。

于 2012-04-12T19:58:05.680 回答