【问题标题】:Autoload database class自动加载数据库类
【发布时间】:2009-09-13 12:28:27
【问题描述】:
  • 我是否可以避免在 Names 对象内实例化 Db 对象来访问它?
  • __autoload 会为此工作吗?
  • 还有其他智能解决方案吗?

我有以下类(它们是概念性的,因此如果执行它们将不起作用):

Db {
    function connect($config) {
        // connect to data base
    }
    function query($query) {
        // Process a query
    }
}
Names {
    function show_names($query) {
        $Db = new Db(); // Is it possible to autoload this object?
        $Db->query(query);
        // Print data
    }
}

【问题讨论】:

    标签: php database oop


    【解决方案1】:

    类可以自动加载,但对象必须实例化。看来您的问题是试图使这两个类更松散耦合。对于这个问题,最简单的解决方案可能是使用Singleton 设计模式。但是,这不是最好的解决方案,因为您可能决定拥有多个数据库连接,并且在单元测试中也会出现问题。我建议看一下Dependency Injection 的概念,它更复杂,但更灵活。

    【讨论】:

    【解决方案2】:

    一个经常用于数据库连接相关类的解决方案是使用Singleton Design Pattern (example of implementation in PHP)。

    它允许有一个类来封装与数据库的连接,并确保在 PHP 脚本的生命周期内只打开一个连接——永远不会更多。

    这将允许您使用类似这样的语法:

    $db = Db::getInstance();
    $db->query('...');
    

    或者:

    Db::getInstance()->query('...');
    


    关于自动加载:它会起作用,只要:有一种方法可以将类的名称映射到文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多