【问题标题】:PHP isset() function misfiringPHP isset() 函数失败
【发布时间】:2013-06-26 21:22:28
【问题描述】:

我遇到了 PHP 的 isset 函数的问题。 (对我来说)它经常和神秘地失火。

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

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

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

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

【问题讨论】:

  • 你用的是什么版本的php?
  • 不客气:3v4l.org/f9fNp
  • @PeeHaa:请将其发布为答案,以便未来的读者可以在不依赖外部站点的情况下看到它。
  • 总是对代码块使用括号。甚至(尤其是)对于一个班轮。您会在意料之外的时刻感谢您
  • @PeeHaa 你摇滚。另外,我要切换到 3v4l.org!

标签: php


【解决方案1】:

考虑以下代码:

$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 中得到了修复,changelog for 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

【讨论】:

  • 此信息的任何 phpdoc 链接?很高兴得到这个问题的完整描述答案。 ;)
  • 问题是为什么它似乎从 PHP 5.0.0 开始工作,而 phpdoc 说它是从 PHP 5.4.0 开始。 ;>
  • 版本不应该是> 5.4.0
  • Checking non-numeric offsets of strings now returns FALSE. ..不知道..
【解决方案2】:

我通常使用如下的空函数:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2017-10-25
      相关资源
      最近更新 更多