PHP数组键与自身不匹配

时间:2012-06-28 23:27:17

标签: php arrays

我有一个非常复杂的PHP应用程序,但XDebug帮助将问题跟踪到某一点,我不再理解PHP了。我试着详细说明该问题的希望相关核心。

有一个类层次模型ModelCore-> Model-> LMC-> MC。在LMC中有一个insert()方法,它有以下代码行:

if($this->createEntry($mKey)) return $this->getEntry($mKey);

{L}中也定义了getEntry方法:

function getEntry($mKey){
   if(array_key_exists($mKey, $this->aItemList) || $this->createEntry($mKey)) return $this->aItemList[$mKey];
   return false;
}

createEntry在LMC中是抽象的,在MC中定义:

function createEntry($mKey){
   if(array_key_exists($mKey, $this->aItemList) && ($this->aItemList[$mKey] instanceof LCI))
      return false;
   $this->aItemList[$mKey] = new $this->sItemClass($this,$mKey,(!array_key_exists($mKey,$this->aData))? LCI::Appended : LCI::Unread);
   return ($this->aItemList[$mKey] instanceof LCI);
}

LCI是另一个与上面显示的树无关的类。 sItemClass是LCI的正确子类。那么发生了什么?

如果createEntry已经有相同密钥的条目(LCI类型),则

false应该返回$this->aItemList。否则它将创建这样的条目。考虑到显示的第一行,只有在创建了这样的条目并且类型正确的情况下才会调用getEntry。然而,其中的条件没有找到条目并且可以重新创建条目,这当然不会导致数组中的第二个条目。

测试中使用的键值是16通过floatval生成的。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

感谢John Green,我将数据库的密钥更改为字符串,它完美无缺。事实上,我正在寻找另一个问题。 MC是一个模型,作为对视图的引用传递。在一天结束时,对于最初构建的模型和视图中保持的引用,我在MC-> aItemList [16]中具有不同的LCI实例值。事实上,LCI的构建没有任何数据,鉴于CTOR,这是不可能的。但是这个问题也消失了。

经验教训:

  • 在PHP中检查浮点数是否相等似乎比通常更麻烦(在$a != $a之前从未见过!)
  • array_key_exists()的结果可能与使用浮点数时的索引访问[]不一致
  • 使用浮点作为数组索引可能会产生超出简单错误关联和超乎想象的副作用

感谢您检查代码并排除不可能揭示真相,无论它看起来多么不可能。