我应该如何在其他课程中使用我的数据库类?
我有一个数据库包装类。我应该如何使用这个类对象在其他类中执行查询?我应该如何在其他课程中使用我的数据库类?
$liveresellerdb=new Database('host','user','spswd','db');
$fetch = $liveresellerdb->getResult($select_resellerData);
我应该如何在我的一个类中包含数据库对象?
Class one
{
function a(){
$sql="select * from table ";
//how should i execute here my query i mean to say
//every time i can't create the new object
// i want to know the good method by which i just execute the query by
// giving the database name
}
}
我建议反对Singleton模式(使用静态成员是此模式的变体),并使用依赖注入来代替。这意味着您通过构造函数将数据库对象传递给您的服务(使用连接的类)。
这里是一个例子。
class UserFinder
{
private $db;
public function __construct(Database $db)
{
$this->db = $db;
}
public function findAllActive()
{
$sql = 'SELECT * FROM users WHERE active = 1';
return $this->db->executeAndFetchAll($sql);
}
}
$db = new Database($host, ...);
$finder = new UserFinder($db);
$users = $finder->findAllActive();
这可以确保你不会绑定到特定的实现数据库类的(你可以做一个子类),并允许您创建单独UserFinder
s的独立Database
实例。它还将使得为应用程序编写测试变得更加容易,因为您拥有更少的依赖关系,这些依赖关系不会隐藏并且可以替换。
简而言之:使用依赖注入。
由于全局变量是脏的(你总是需要global $var;
语句),最简单的解决办法是将它们存储在一类,例如静态成员Database::$db
。
另一种解决方案(在适当的OOP环境中)将数据库实例传递给类 - 在您的代码中,它将是one
的构造函数,它接受实例并存储在私有成员变量中。
也许,您应该考虑根据Singleton Pattern实施Database
课程。
更新(按照下面评论):
确定。我在这里只有一个建议(除了通过方法参数传递对象和依赖注入,在igorw's comment中描述)...
依赖注入是一种好方法,但是这种情况下 - 我想 - 有少量的数据库,所以最好将它们全部保存在一些静态私有数组中并通过键获取。
因此,您将只有一个公共静态方法getInstance($key)
,并且可以将键存储为某些预定义的常量(以避免“拼写”错误)。
这种方式根本不需要初始化(getInstance($key)
可根据$ key参数使用必要的参数[传递给构造函数]创建新的数据库对象)。一般来说,依赖注入看起来更好,但在某些特定情况下,这种方式可以更容易使用。
但我想多个数据库实例,意味着我需要连接到多个数据库。 – XMen 2011-03-16 10:37:09
,然后您创建一个通用数据库类,您可以获取/创建新的数据库连接。 – RobertPitt 2011-03-16 11:28:38
可能是确定有通过名字保存在一个静态属性数据库连接Db的setAdapter方法:
Db::setAdapter('db1', 'mysql:host=localhost;dbname=' . $dbname, $user, $pass);
Db::setAdapter('db2', 'mysql:host=localhost;dbname=' . $dbname2, $user2, $pass2);
然后,getAdapter方法需要时会返回一个数据库连接:
Db::getAdapter(); // return the default one
Db::getAdapter('db2'); // return an instance by its name
在幕后你也可以实现一个懒惰的连接。
更好的问题,然后最后一篇文章! – RobertPitt 2011-03-16 11:27:30