代码之家  ›  专栏  ›  技术社区  ›  Cudos

自动加载数据库类

  •  1
  • Cudos  · 技术社区  · 15 年前
    • 我可以避免在Names对象内实例化一个DB对象来访问它吗?
    • 自动加载可以吗?
    • 还有其他智能解决方案吗?

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

    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
        }
    }
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   Ignas R    15 年前

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

        2
  •  2
  •   Pascal MARTIN    15 年前

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

    它允许有一个类来封装到数据库的连接,并确保在PHP脚本的生命周期内只打开一个连接——再也没有了。

    这将允许您使用如下语法:

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

    或:

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


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