![](/img/trans.png)
[英]Want to upgrade my database class written in mysql*. What should I use next?
[英]How should I use my database class in other class?
我有一个数据库包装器类。 我应该如何使用该类对象在其他类中执行查询?
$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();
这样可以确保您不受数据库类的特定实现约束(可以创建子类),并允许您使用单独的Database
实例创建单独的UserFinder
。 这也将使为应用程序编写测试变得更加容易,因为您的依赖项更少,这些依赖项不是隐藏的,也是可替换的。
简而言之:使用依赖注入。
由于全局变量是脏的(您始终需要global $var;
语句),所以最简单的解决方案是将它们存储在类的静态成员中,例如Database::$db
。
另一个解决方案(在适当的OOP环境中)是将数据库实例传递给类-在您的代码中,它将是one
接受实例并存储在私有成员变量中的实例的构造函数。
也许您应该考虑根据Singleton Pattern实现您的Database
类。
更新(根据下面的评论):
好。 我在这里只有一个建议(除了通过方法的参数和Dependency Injection传递对象,如在igorw的注释中所述 )...
依赖注入是一种好方法,但是,我想,这种情况下您的数据库数量很少,因此最好将它们全部保存在某个静态私有数组中并通过键来获取。
因此,您只有一个公共静态方法getInstance($key)
并且可以将键存储为一些预定义的常量(以避免“拼写”错误)。
这样,您根本不需要初始化( getInstance($key)
可以创建具有必要参数的新数据库对象[传递给构造函数],具体取决于$ key参数)。 通常,依赖注入看起来更好,但是在某些特定情况下,这种方式更易于使用。
可以有一个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
在后台,您也可以实现惰性连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.