8

我了解到isset($array)在检查特定密钥是否存在时不需要这样做,但是我也知道有一些理由在没有已知密钥的情况下检查是否$array已实例化。

例如这个:

foreach ($foo as $bar) {
    echo $bar;
}

PHP 注意:未定义变量:foo
PHP 警告:为 foreach() 提供的参数无效

这样更好:

if (isset($foo)) {
    foreach ($foo as $bar) {
    echo $bar;
    }
}

因为我在处理数据时经常使用数组,所以我想问一下是否还有其他一些情况我应该检查整个数组isset()?或者我应该坚持检查每一个$array[$key]我将要使用的东西吗?这涉及到这样做是否有任何优点或缺点的问题:

if (isset($foo[0])) {
    foreach ($foo as $bar) {
        // noop
    }
}

而不是这个:

if (isset($foo)) {
    foreach ($foo as $bar) {
        // noop
    }
}

那么,我应该使用if is knownisset($array)代替吗?isset($array[$key])$key

4

2 回答 2

18

在 PHP 中,isset()是一种特殊的形式,而不是函数;当您调用 时isset($ary[$index])$ary不必先设置其本身。即使使用E_STRICT,调用也不会产生警告,因为isset实际上并没有尝试访问$ary[$index]; 它尽可能确定$ary未设置并返回false。因此,您无需先检查数组即可应用于isset元素。

您的问题表明您已经知道这一点,并且想知道您是否有理由这样做。我唯一能想到的就是效率:如果您要检查数组中是否存在大量键,您可以通过首先检测数组本身何时未设置并跳过所有键来节省一些工作在这种情况下,单独的密钥检查。

于 2012-04-23T01:01:28.543 回答
6

如果您想知道数组是否已定义,请使用isset($array).

如果您想知道是否定义了特定键,请使用isset($array[$key]).

例如,这是完全有效的:

$foo = array();
foreach($foo as $bar) {
    // never called because $foo is an empty array
}
于 2012-04-23T00:52:10.990 回答