我在一个调用我继承的抽象类的基类中得到这个吗?
class ConcreteClass extends MyAbstractClass(){
public function __construct(){
parent::__construct(); //or other method that returns my adapter, PDO in this case.
}
}
或者,我是否在创建的每个对象引用上都获得一个新的适配器:
class ConcreteClass extends BaseClass(){ //or no class extension for that matter
public function __construct(){
public function __construct(DB $adapter) { //or call DB on another class for DI via set/get
$this->adapter = $adapter;
$this->adapter->connect();
}
}
}
我将创建一个到数据库的新连接,并创建每个对象。这不好吗?除了我不想使用的singleton之外,我不知道还有其他方法可以做到这一点。
http request->controller->最终我得到了我的对象,它在每次创建对象时调用数据库,新的连接。
我已经创建了一个类型为"DB"的接口或抽象类,因此如果需要,我可以更改我的数据源,尽管我已经在使用PDO了。
您可以查看Laravel框架是如何解决这一问题的-请参阅https://github.com/illuminate/database/blob/master/DatabaseManager.php.此DatabaseManager对象的AFAIK单个实例存储在Laravel-ioc容器中。
"我会在创建每个对象的情况下创建一个到数据库的新连接。这很糟糕吗?"-取决于:
- 当连接到远程机器时,为每个对象创建新连接可能会耗费时间/资源,尤其是当您有很多对象时
- 您还可能达到某种最大连接限制,尤其是当嵌套类使用单独的连接时(也就是说,存储连接的对象的refcount在脚本执行结束前不会达到0)
- AFAIK所有与事务相关的东西只能在单个连接上操作,所以当您使用单独的连接时,比如说在持久层中,没有办法在服务层中使用事务逻辑
还有IMHO,如果你需要换掉PHP中的数据源,你已经完蛋了。PDO是PHP所能提供的最好的,它一点也不好——它只为您提供持久的PHP API,您仍然需要手动转换所有特定于供应商的SQL。