我一直在尝试写出"好的代码",并使用依赖注入将数据库对象通过构造函数传递给我的类。
构造函数通常采用以下形式:
public function __construct(MongoDB $db) {
$this->collection = $db->collectionName;
}
我注意到每次创建对象时都会创建一个
MongoCollection
的新实例。(即访问$db->collectionName
属性两次会返回两个不同的对象,而不是同一个对象)我一直在使用ActiveRecord风格的基类,以便对象能够自我CRUD。
现在当我使用某种
getAllRecords()
函数,并且返回100多个这些对象时,就会创建100多个MongoCollection
对象。(快速查看驱动程序源代码似乎表明对象在PHP中不止有新的表示,也会创建新的对象)通过封装
Mongo
和MongoDB
类并实现缓存来解决了这个问题。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的这种行为是有意为之吗?它每次都返回一个新对象,这是个bug/feature还是PHP驱动程序或Mongo本身的问题(是否需要两个相同集合的对象)?
- 如果缓存已创建并重用
MongoDB
和MongoCollection
对象,我会给自己造成问题吗? - 其他人通常如何处理MongoDB?我应该完全使用不同的方法吗?(例如:数据映射器)
Leigh.