PHP isset()函数失效

时间:2013-06-26 21:22:28

标签: php

我遇到了PHP的isset函数问题。对我而言,经常是神秘的(对我来说)是失误的。

例如,当我有一个可以是字符串或错误数组的变量时,我尝试使用isset来查看该变量是否包含该数组的已知索引之一,如下所示:

$a = "72";
if(isset($a["ErrorTable"]))
    echo "YES";
else
    echo "NO";

这个坏男孩在我的服务器上一直打印YES。我在Ideone上尝试了它(在线解释器的东西。很酷!)这里:http://ideone.com/r6QKhK并打印出NO。

我认为这与我们正在使用的PHP版本有关。有人可以对此有所了解吗?

3 个答案:

答案 0 :(得分:11)

考虑以下代码:

$a = "72";
var_dump( isset($a["ErrorTable"]) );

您正在检查是否设置了$a["ErrorTable"]。 PHP首先将任何非数字偏移量转换为int,这使得ErrorTable等于0

基本上,你只是在做:

if ( isset($a[0]) ) 

PHP中的字符串可以访问数组,$a[0]肯定已设置,条件将评估为TRUE

但是,这种奇怪的行为在PHP 5.4.0中得到修复,isset()的{​​{3}}表示:

  

5.4.0 - 检查字符串的非数字偏移现在返回FALSE。

您的服务器可能正在使用旧版本的PHP,这可以解释为什么它会输出YES


您可以改为使用changelog

$a = "72";
if ( is_array($a) && array_key_exists('ErrorTable', $a) ) {
    echo 'YES';
} else {
    echo 'NO';
}

所有PHP版本的输出都是NO

答案 1 :(得分:0)

我通常使用空函数,如:

$a = "72";
if(!empty($a["ErrorTable"]))
     echo "YES";
else
     echo "NO";

答案 2 :(得分:-1)

$ a [0]是一种引用字符串中第一个字符的方法,即值“7”。因为字符串字符只是由它们的数值引用,所以“ErrorTable”是对int(0)的类型转换

在PHP 5.2.17和5.3.23中就是这种情况,但在5.4.15或5.5.0中却没有