我应该如何在其他类中使用我的数据库类?

时间:2011-03-16 10:28:49

标签: php database oop wrapper

我有一个数据库包装类。我该如何使用这个类对象在其他类中执行查询?

$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    
    }
}

4 个答案:

答案 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

在幕后,你也可以实现一个懒惰的连接。