我有一个非常复杂的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
生成的。
有什么想法吗?
答案 0 :(得分:0)
感谢John Green,我将数据库的密钥更改为字符串,它完美无缺。事实上,我正在寻找另一个问题。 MC是一个模型,作为对视图的引用传递。在一天结束时,对于最初构建的模型和视图中保持的引用,我在MC-> aItemList [16]中具有不同的LCI实例值。事实上,LCI的构建没有任何数据,鉴于CTOR,这是不可能的。但是这个问题也消失了。
经验教训:
$a != $a
之前从未见过!)array_key_exists()
的结果可能与使用浮点数时的索引访问[]
不一致感谢您检查代码并排除不可能揭示真相,无论它看起来多么不可能。