php共享数据库连接(设计模式帮助)
我有一个小php应用程序,我想在上面构建一个db抽象层,并使用一些模型类型类 我正在使用ezSQL_mysql来做数据库工作 我的问题是,设计应用程序的最佳方式是什么?我应该使用单例模式来共享db连接吗?我的模型类应该扩展ezSQL_mysql吗?或者我在这里完全偏离了方向,需要做些别的事情 我需要的是这样的东西 Controller.phpphp共享数据库连接(设计模式帮助),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);
$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语句。你说得对,我可能有点过度设计了。