我对PHP的isset函数有问题。它经常而且神秘地(对我来说)不合拍。
例如,当我有一个可以是字符串或错误数组的变量时,我会尝试使用isset来查看该变量是否包含数组的已知索引之一,如下所示:
$a = "72";
if(isset($a["ErrorTable"]))
echo "YES";
else
echo "NO";
这个坏男孩在我的服务器上一直打印YES。我在Ideone(在线翻译)上试过了。很酷!)这里:http://ideone.com/r6QKhK并打印出编号
我认为这与我们使用的PHP版本有关。有人能解释一下吗?
考虑以下代码:
$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()
的更改日志显示:
5.4.0--检查字符串的非数字偏移现在返回FALSE。
您的服务器可能正在使用较旧版本的PHP,这可以解释为什么它会输出YES
。
您可以使用array_key_exists()
代替:
$a = "72";
if ( is_array($a) && array_key_exists('ErrorTable', $a) ) {
echo 'YES';
} else {
echo 'NO';
}
所有PHP版本的输出都是NO
。
我通常使用空函数,如:
$a = "72";
if(!empty($a["ErrorTable"]))
echo "YES";
else
echo "NO";
$a[0]是一种引用字符串中第一个字符的方法,即值"7"。因为字符串只是由其数值引用,所以"ErrorTable"被类型转换为int(0)
这是PHP 5.2.17和5.3.23中的情况,而不是5.4.15或5.5.0