私は非常に複雑な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;
}
createEntryLMCで抽象的であり、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は、上記のツリーとは関係のない別のクラスです。sItemClassLCIの適切なサブクラスです。では、何が起こっているのでしょうか。
createEntryタイプLCIの同じキーのエントリがすでにあるfalse場合は、を返すことになっています。$this->aItemListそれ以外の場合は、そのようなエントリを作成します。示されている最初の行を考慮するgetEntryと、そのようなエントリが作成され、適切なタイプである場合にのみ呼び出されます。ただし、その中の条件はエントリを検出せず、エントリを新たに作成できます。これにより、もちろん、配列に2番目のエントリが作成されることはありません。
テストで使用されるキー値は、16を介して生成されfloatvalます。
そこで何が起こっているのか考えはありますか?