php共享数据库连接(设计模式帮助)

php共享数据库连接(设计模式帮助),php,design-patterns,database-abstraction,Php,Design Patterns,Database Abstraction,我有一个小php应用程序,我想在上面构建一个db抽象层,并使用一些模型类型类 我正在使用ezSQL_mysql来做数据库工作 我的问题是,设计应用程序的最佳方式是什么?我应该使用单例模式来共享db连接吗?我的模型类应该扩展ezSQL_mysql吗?或者我在这里完全偏离了方向,需要做些别的事情 我需要的是这样的东西 Controller.php $db = new ezSQL_mysql($db_user, $db_passwd, $db_database, $db_host);

我有一个小php应用程序,我想在上面构建一个db抽象层,并使用一些模型类型类

我正在使用ezSQL_mysql来做数据库工作

我的问题是,设计应用程序的最佳方式是什么?我应该使用单例模式来共享db连接吗?我的模型类应该扩展ezSQL_mysql吗?或者我在这里完全偏离了方向,需要做些别的事情

我需要的是这样的东西

Controller.php

   $db = new ezSQL_mysql($db_user, $db_passwd, $db_database, $db_host);


   $user = new User();
   $user->update_email($new_email);

   $sale = new Sale();
   $sale->purchase($amount); 
User_model.php

class User {

   /* uses $db connection */
   function update_email(){
     /* do something */
   };
}
class Sale {   
   /* uses $db connection*/

   function purchase () {
    /* do something */ 
   }
}
Sale_model.php

class User {

   /* uses $db connection */
   function update_email(){
     /* do something */
   };
}
class Sale {   
   /* uses $db connection*/

   function purchase () {
    /* do something */ 
   }
}

对于小型应用程序,一定要使用域对象模式。也就是说,每个对象都表示db实体

然后,您可以决定是否使用mapper模式向db添加一些更复杂的查找

如果您更喜欢经过测试的解决方案,可以检查Zend_Db。它涵盖了您所需要的一切,从db适配器、工厂等。它基本上实现了网关模式,但实现类似mapper的东西已经在参考手册中显示

其他解决方案包括类似ORM的条令或推进


模式不应该被过度使用。如果是一个小应用程序,请尽可能轻松地解决问题。如果你把这当作一个实验,试着玩弄一些东西。这些库有时会非常惊人。

DB连接单例可能会有问题。幸运的是,连接共享不需要它。您可以拥有一个连接管理器类,当给定以前使用的主机、用户和数据库名称时,该类将返回已打开的连接

abstract class ConnectionManager {
    protected $connections = array();
    function connect($host, $db, $user, $pw) {
        if (! isset($this->connections[$host][$db][$user])) {
            $this->connections[$host][$db][$user] = $this->newConnection($host, $db, $user, $pw));
        }
    }
    abstract protected function newConnection($host, $db, $user, $pw);
}

class EzSQLConnectionManager extends ConnectionManager {
    protected function newConnection($host, $db, $user, $pw) {
        return new ezSQL_mysql($user, $passwd, $database, $host);
    }
}

这里没有提到如何安全地存储用户凭据。密码不应该随意散布在脚本中,这种方法可能会导致您这样做。

好的。。。因此,这个小应用的需求像往常一样增长了,我决定使用MVC框架,而不是滚动我自己松散的类集来管理持久连接和抽象数据库层

所以现在我使用CodeIgniter,它基本上以一种更易于管理的方式完成了我想要做的事情


谢谢你的其他答案

谢谢你的洞察力。我想我要做的只是从视图中提取一些内联sql语句。你说得对,我可能有点过度设计了。