我有一个数据库包装类。我该如何使用这个类对象在其他类中执行查询?
$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
}
}
答案 0 :(得分:3)
我建议不要使用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();
这确保您不会绑定到Database类的特定实现(您可以创建子类),并允许您创建具有单独UserFinder
实例的单独Database
。它还可以更轻松地为您的应用程序编写测试,因为您具有较少的依赖关系,这些依赖关系不会被隐藏,也可以替换。
简而言之:使用依赖注入。
答案 1 :(得分:2)
由于全局变量是脏的(您总是需要global $var;
语句),最简单的解决方案是将它们存储在类的静态成员中,例如: Database::$db
。
另一个解决方案(在适当的OOP环境中)将数据库实例传递给类 - 在您的代码中,它将是one
的构造函数,它接受实例然后存储在私有成员变量中。 / p>
答案 2 :(得分:2)
也许,您应该考虑根据Singleton Pattern实施Database
课程。
更新(根据下面的评论):
确定。我这里只有一个建议(除了通过方法的参数和依赖注入传递对象,在igorw's comment中描述)...
依赖注入是一种很好的方法,但是这种情况你 - 我想 - 有一些少量的数据库,所以最好将它们全部保存在一些静态私有数组中并通过密钥获取。
因此,您将只有一个公共静态方法getInstance($key)
,并且密钥可以存储为一些预定义的常量(以避免“拼写”错误)。
这样你根本不需要初始化(getInstance($key)
可以创建具有必要参数的新数据库对象[传递给构造函数],具体取决于$ key参数)。一般来说,依赖注入看起来更好,但在某些特殊情况下,这种方式可以更容易使用。
答案 3 :(得分:1)
可以使用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
在幕后,你也可以实现一个懒惰的连接。