问题 PHP isset()函数失误


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

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

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

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

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


1190
2018-06-26 21:22


起源

你用的是什么版本的php? - user20232359723568423357842364
别客气: 3v4l.org/f9fNp - PeeHaa
@PeeHaa:请将其作为答案发布,以便未来的读者可以在不依赖外部网站的情况下看到它。 - Andy Lester
总是 使用括号代码块。甚至(特别是)一个衬里。你会在不太期待的时刻感谢你 - Marcin Orlowski
@PeeHaa你摇滚。另外,我正在切换到3v4l.org! - CptAJ


答案:


考虑以下代码:

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

输出将是 NO 在所有PHP版本上。


11
2018-06-26 21:26



这个信息的任何phpdoc链接?很高兴得到这个问题的完整描述答案。 ;) - Jakub Matczak
@dragoste:看到更新的答案:) - Amal Murali
问题是为什么它似乎从PHP 5.0.0起作用,而phpdoc说它是从PHP 5.4.0开始。 ;> - Jakub Matczak
不应该是版本 > 5.4.0 - amaster
啊,它也适用于5.0.0-5.0.2版本。看这里 3v4l.org/f9fNp - Jakub Matczak


我通常使用空函数,如:

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

0
2018-06-22 12:13





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

这是PHP 5.2.17和5.3.23中的情况,但不是5.4.15或5.5.0中的情况


-1
2018-06-26 21:24