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

问题描述:

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

$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

更好的问题,然后最后一篇文章! – RobertPitt 2011-03-16 11:27:30

我建议反对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实例。它还将使得为应用程序编写测试变得更加容易,因为您拥有更少的依赖关系,这些依赖关系不会隐藏并且可以替换。

简而言之:使用依赖注入。

+0

但是我有2 3个数据库实例 – XMen 2011-03-16 11:52:39

+0

所以,一个UserFinder实例总是绑定到一个数据库实例。 – igorw 2011-03-16 11:58:05

由于全局变量是脏的(你总是需要global $var;语句),最简单的解决办法是将它们存储在一类,例如静态成员Database::$db

另一种解决方案(在适当的OOP环境中)将数据库实例传递给类 - 在您的代码中,它将是one的构造函数,它接受实例并存储在私有成员变量中。

+0

请检查这个问题http://*.com/questions/5324300/while-making-the-static-class-for-database-getting-this-error – XMen 2011-03-16 10:57:57

+0

我看到使用静态类的好处,不需要通过数据库对象到每个类什么是使用oops概念的好处 – XMen 2011-03-16 10:59:32

也许,您应该考虑根据Singleton Pattern实施Database课程。


更新(按照下面评论):

确定。我在这里只有一个建议(除了通过方法参数传递对象和依赖注入,在igorw's comment中描述)...

依赖注入是一种好方法,但是这种情况下 - 我想 - 有少量的数据库,所以最好将它们全部保存在一些静态私有数组中并通过键获取。

因此,您将只有一个公共静态方法getInstance($key),并且可以将键存储为某些预定义的常量(以避免“拼写”错误)。

这种方式根本不需要初始化(getInstance($key)可根据$ key参数使用必要的参数[传递给构造函数]创建新的数据库对象)。一般来说,依赖注入看起来更好,但在某些特定情况下,这种方式可以更容易使用。

+0

但我想多个数据库实例,意味着我需要连接到多个数据库。 – XMen 2011-03-16 10:37:09

+0

,然后您创建一个通用数据库类,您可以获取/创建新的数据库连接。 – 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 

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