質問がかなり前に行われたことは知っていますが、他の誰かが同様のジレンマに陥った場合に備えて、まだ答えたいと思っていました。実際、著者が行った上記の提案 #1、2、3 はすべて関連しており、問題を解決するにはそれらすべてを考慮する必要があります。
1)DBオブジェクトから取得した各オブジェクトをマッパーに保存して、同じIDを持つオブジェクトが要求されたときに再度行う必要がないようにします。その後のすべての呼び出しで、マッパーは格納されたオブジェクトを返す必要があります。これをIdentityMapパターンと呼びます。これを実現するには、マッパーでプライベート プロパティを作成して、特定のオブジェクト タイプの IdentityMap のインスタンスを保持します。Site_Mapper->get() メソッドは、オブジェクトが取得されていない場合、特定の ID の IdentityMap を常にチェックする必要がありますが、マッパーはデータベースにアクセスしますが、既にマップに格納されている場合は、トリップを保存するキャッシュされたインスタンスを返します。データベース。したがって、同じオブジェクト インスタンスへの参照になるため、 $a === $b は true になるはずです。
2) はい、理想的には、特定の時点で IdentityMap の単一のインスタンスを維持するために、特定のデータ マッパー (Site_Mapper) のインスタンスが常に 1 つ存在する必要があります。これは、 Singletonパターンを使用して実行できます。これは、特定のマッパーの同じインスタンスを常に返すSite_Mapper::getInstance()などの getter メソッドで可能です。また、 __construct()をプライベート メソッドとして宣言して、newを使用した不要なインスタンス化を防ぎ、 getInstance()がマッパーをインスタンス化する唯一の方法であることを確認する必要があります。
3) 著者が静的プロパティについて上で言及したことも同様です。PHPでシングルトンを実装するには、静的プロパティを使用してマッパーのインスタンスを保持する必要があります。
上記のパターンやその他多くのパターンについて説明している Martin Fowler の著書「エンタープライズ アプリケーション アーキテクチャのパターン」を強くお勧めします。独自のカスタム ORM ソリューションに取り組んでいる場合は特に、お読みください。それが役立つことを願っています。