我有一个相当复杂的 PHP 应用程序,但 XDebug 帮助我将问题追踪到了一个我不再了解 PHP 的地步。我试图详细说明问题的相关核心。
有一个类层次结构 ModelCore->Model->LMC->MC。在 LMC 中有一个 insert() 方法,它具有以下代码行:
if($this->createEntry($mKey)) return $this->getEntry($mKey);
该getEntry
方法也在 LMC 中定义:
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
应该返回false
,如果$this->aItemList
已经有相同键的条目,它是 LCI 类型的。否则它将创建这样一个条目。考虑到显示的第一行,getEntry
只有在已创建此类条目且类型正确时才会调用。然而,其中的条件没有找到条目并且可以重新创建条目,这当然不会导致数组中的第二个条目。
测试中使用的键值是16
通过floatval
.
有什么想法吗?