在我的项目中使用我的数据库类和其他类

时间:2010-08-29 15:23:02

标签: php database oop class object

我有自己编写的自定义数据库类,我还有一个用户类和一个站点类。

MySQL类有这样的方法:

connect
query
clean
fetch

用户类:

register
login
logout
resetPass

网站类:

updateTopics
addTopic
addPost
addReply

这些类需要与数据库连接,这就是我为MySQL编写的类。但是,我不知道如何在这些类中正确使用MySQL类。我是否将类定义为全局类,并在其他类中引用它?我可以这样做:

$db = new MySQL();
$user = new User($db);

然后像那样引用它?

感谢任何帮助,谢谢。 :)

3 个答案:

答案 0 :(得分:3)

除了Daniel Vandersluis的回答: 在类中实例化对象会在这些类之间创建强依赖关系。您可能会对依赖注入和控制反转(+ ioc容器)感兴趣。

见:
http://en.wikipedia.org/wiki/Dependency_injection
http://martinfowler.com/articles/injection.html


btw:你真的需要你自己的MySQL类实现吗?已经有这么多的数据库访问和抽象层可用。例如。 http://docs.php.net/pdo

答案 1 :(得分:1)

您可能只对一次显示MySql类感兴趣。它可以防止在执行期间多次打开和关闭连接。我喜欢使用工厂概念。它是一个处理对象实例化的类,你可以按照Singleton概念编写它只允许一个实例。

像这样:

class Factory {

    private static $objects = array();

    static function get_database() {

        if( ! isset(self::$objects['database']))
            self::$objects['database'] = new MySql();

        return self::$objects['database'];
    }
}
你可以这样使用:

$db = Factory::get_database();

请注意,它始终返回相同的MySql实例,而不是创建新的实例。

嗯,但这只是一个非常简单的工厂实现,只是为了理解。它可能会好很多=]

答案 2 :(得分:-1)

您可以在其他课程中实例化您的MySQL课程,例如:

class User
{
  private $db;

  function __construct(...)
  {
    $this->db = new MySQL();
  }

  function accesses_database(...)
  {
    $this->db->query(...);
  }
}

然后在您想要访问数据库时在类中引用$this->db

此外,如果您希望只有MySQL的一个实例,则可以将其设为singleton