Я пытался написать «хороший код» и использовать внедрение зависимостей для передачи объектов базы данных в конструкторы моих классов.
Обычно конструкторы принимают следующую форму:
public function __construct(MongoDB $db) {
$this->collection = $db->collectionName;
}
Я заметил, что для каждого созданного объекта создается новый MongoCollection
.(т.е. доступ к свойству $db->collectionName
дважды возвращает два разных объекта, а не один и тот же объект)
Я использовал базовый класс стиля ActiveRecord, так что объекты могут сами CRUD.
Теперь, когда я использую какую-то функцию getAllRecords()
и возвращаю сотни этих объектов, создаются сотни объектов MongoCollection
.(Беглый взгляд на источник драйвера, похоже, указывает на то, что там тоже создаются новые объекты, а не только новые представления в PHP)кеширование.
class MyMongo extends Mongo
{
private $objectCache = array();
public function __get($name) {
return array_key_exists($name, $this->objectCache)
? $this->objectCache[$name]
: $this->objectCache[$name] = new MyMongoDB($this, $name);
}
}
class MyMongoDB extends MongoDB
{
private $objectCache = array();
public function __get($name) {
return array_key_exists($name, $this->objectCache)
? $this->objectCache[$name]
: $this->objectCache[$name] = new MongoCollection($this, $name);
}
}
У меня следующие вопросы:
- Это предполагаемое поведение MongoDB?Должен ли он действительно каждый раз возвращать новый объект, или это ошибка / особенность в драйвере PHP или в самом Mongo (есть ли вариант использования для двух объектов для одной коллекции?)
- Смогу ли явызывать проблемы для себя, кэшируя либо / оба
MongoDB
и MongoCollection
создаваемые объекты, и используя их повторно. - Как другие люди обычно справляются с работой с MongoDB?Должен ли я использовать другой подход полностью?(Т. Е. DataMapper)
Спасибо,
Ли.