Я знаю, что вопрос задавался довольно давно, но все же хотел ответить на тот случай, если кто-то столкнется с подобной дилеммой. На самом деле все приведенные выше предложения № 1,2,3, сделанные автором, связаны друг с другом, и для их решения необходимо рассмотреть их все.
1) Сохраните каждый полученный из БД объект в маппере, чтобы вам не приходилось делать это снова, когда запрашивается объект с тем же идентификатором. Во всех последующих вызовах маппер должен возвращать сохраненный объект. Это называется IdentityMap pattern. Чтобы достичь этого, сделайте частное свойство в вашем преобразователе для хранения экземпляра IdentityMap для данного типа объекта. Метод Site_Mapper-> get () должен всегда проверять IdentityMap на предмет заданного идентификатора, если объект еще не получен, но маппер перейдет в базу данных, но если он уже сохранен в карте, он возвращает кэшированный экземпляр, который сохраняет поездку база данных. Таким образом, $ a === $ b должно быть истинным, поскольку они будут ссылками на один и тот же экземпляр объекта.
2) Да, в идеале всегда должен быть один экземпляр данного преобразователя данных (Site_Mapper), чтобы поддерживать один экземпляр IdentityMap в данный момент времени. Это можно сделать с помощью шаблона Singleton . Это возможно с некоторым методом получения, таким как Site_Mapper :: getInstance () , который всегда будет возвращать один и тот же экземпляр данного преобразователя. Вы также должны объявить __ construct () как частный метод, чтобы предотвратить нежелательное создание экземпляров с помощью new и убедиться, что getInstance () является единственным способом создать экземпляр картографа.
3) То, что автор упомянул выше о статических свойствах, также верно. Для реализации Singleton в PHP необходимо использовать статическое свойство для хранения и экземпляр Mapper.
Я бы настоятельно рекомендовал книгу Мартина Фаулера «Шаблоны архитектуры корпоративных приложений», в которой говорится о вышеупомянутых шаблонах и многом другом. Это хорошо читается, особенно если вы работаете над собственным решением ORM. Надеюсь, это поможет.