php 5.3阵列兼容性

时间:2010-12-07 00:51:07

标签: php arrays compatibility

在php 5.3中,处理数组的方式已经改变。

示例数组:

<?php $a = array ('foo' => 1, 'bar' => 2, 'foo' => 3); ?>

用来覆盖'foo'和数组中的最后一个给出:

array(
    'foo' => 3,
    'bar' => 2
)

现在在5.3中它返回

array(
    'foo' => 1,
    'bar' => 2
)

我正在测试php v5.2.11,所以我无法测试这个我的自我这个例子来自php.net网站:http://php.net/manual/en/language.types.array.php并搜索页面5.3

是通过

设置值的方法
<?php
    $a['foo'] = 1;
    $a['bar'] = 2;
    $a['foo'] = 3;
?>

为此问题提供向后兼容的补丁? 在新版本的php中处理数组时还有其他注意事项吗?

3 个答案:

答案 0 :(得分:3)

这似乎确定了同样的,有点奇怪的行为。

http://www.tehuber.com/article.php?story=20090708165752413

答案 1 :(得分:2)

从手册:

  

请注意,当定义两个相同的索引时,最后一个覆盖第一个索引。

因此,除非你以某种方式触发了一个PHP错误(不太可能),否则还会发生一些你遗漏的错误。

要回答你的问题,是的,通过赋值运算符覆盖密钥。但是,在开始更改代码之前,我会检查以确保问题是您当前的想法,因为手册直接声称后面的密钥会覆盖以前的密钥。

更新: @ sberry2A的链接确实显示了PHP 5.3有错误的地方(即,没有按手册所说的那样做)。

class Foo
{
  const A = 1;
  const B = 1;

  public static $bar = array(self::A => 1, self::B => 2);
}

可以预期Foo::$bar[1]的值为2,但它仍为1。但是,以下工作正常:

class Foo
{
  const A = 1;
  const B = 1;

  public static function bar()
  {
    return array(self::A => 1, self::B => 2);
  }
}

因此,只有具有相同值的不同常量索引的静态属性数组的特定情况。这是PHP 5.3.3中我可以触发行为的唯一方法,但也许还有其他方法......显然不能依赖某种行为。

答案 2 :(得分:0)

我认为您应该为阵列使用唯一键。

<?php $a = array ('foo' => 1, 'bar' => 2); ?>

然后更新foo的值。

<?php $a['foo'] = 3; ?>