0

我是否在基类中调用了我继承的抽象类?什么时候在MVC(PHP)中创建我的数据库连接?

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(); 
    } 
    } 
} 

我将创建与创建的每个对象到数据库的新连接。这不好吗?我不知道另一种办法,除了一个单身人士,我不想使用它。

http请求 - >控制器 - >最终我得到我的对象,这会在每次创建对象时调用数据库,新的连接。

我已经创建了一个类型为“DB”的接口或抽象类,因此如果需要,我可以更改我的数据源,尽管我已经使用了PDO。

+1

这应该有助于http://stackoverflow.com/a/11369679/727208 ..简短的回答:*首次初始化数据映射器,然后为每个其他实例化的数据映射器重新使用相同的数据库连接*。 – 2014-09-04 14:49:54

回答

0

您可以查看Laravel框架如何解决这个问题 - 请参阅https://github.com/illuminate/database/blob/master/DatabaseManager.php。此DatabaseManager对象的AFAIK单个实例存储在Laravel ioc容器中。

我将创建与每个对象创建新的数据库连接是这个坏?” - 这取决于:

  1. 当连接到远程计算机,从而为每个对象新的连接可以是时间/资源消耗,尤其是当您有很多对象时
  2. 您也可能会遇到某种最大连接限制,特别是当嵌套类使用单独的连接时(这是对存储连接的对象的refcount不会在0之前命中脚本执行结束)。
  3. AFAIK与事务相关的所有事务只能在单个连接上运行,所以当你使用单独的连接时,可以说在你的持久层中,没有办法在服务层使用事务逻辑。

和恕我直言,如果你需要换出PHP中的数据源,你已经拧了。 PDO最好是PHP所提供的,并且它对此不太好 - 它只为您提供持久的PHP API,您仍然需要手动转换所有供应商特定的SQL。

+0

那么Laravel使用单例概念?受保护的函数createSingleConnection。 – johnny 2014-09-02 17:27:46

+1

@johnny我对设计模式术语的了解不如应有,但Laravel的默认行为是在需要时创建连接,然后继续使用此连接而不是创建新连接(所以是的,基本上是单例)。连接保存在“字符串” - >“连接”映射中,以便您可以同时连接到不同的数据库。连接管理器本身通过Lavarel容器进行访问。 – Mikk 2014-09-02 17:42:58

相关问题