3

所以我在 PHP 中有一个不断增长的系统,我有一个静态类来处理数据库连接的东西。

<?php 
    class Database {
        // ... connection upon construction and ways of escaping the data
        public function query($query) {
            // performs query and returns the data.
        }
    }

    class API { // Not actually called api, but for the purposes of this
        private static $database = false;

        public static function GetDatabase() {
            if (static::$database === false) {
                static::$database = new Database(connection information)
            }
            return static::$database;
        }
    }
?>    

我还有很多执行特定功能集的“控制器”或数据库适配器。

<?php 
    class UserDBAdapter {
        public function newUser($info) {
            // validates and builds the query statements

            API::GetDatabase()->query($query);
        }
    }
?>

所以真正的问题是我在代码中到处都需要 UserDBAdapter。在几个不同的文件中说,可能在其他控制器中,我不想将它作为变量传递(当每个方法都有它时它会变得烦人)。我也不想创建 2 个这样的对象(出于速度目的)。

那么我可以做一些与我对 $database 对象相同的事情吗?在调用它们之前我不会初始化它们,这应该是有效的,并且无论范围如何,它们都不需要在整个过程中重新创建。至少这就是我开始这个想法的原因,但我不知道它是否是最好的想法。

谢谢

4

2 回答 2

2

我认为您所做的很好,您将数据库连接存储在注册表中,您可以在整个项目中轻松访问。

我想,理想情况下,您也可以在其他类中使用 setDatabase 和 getDatabase 方法覆盖它,并将 API::getDatabase() 作为后备?

Zend 框架有 Zend_Db_Adapter::getDefaultAdapter(),我知道它会使用它。或者我使用 Zend_Registry::set('dbAdapter', $dbAdapter) 将适配器分配给注册表。我知道您没有使用 Zend,但它是某人做类似事情的一个例子。

于 2011-12-14T20:47:47.473 回答
0

通常,您提到的“控制器”在单独的文件中作为单独的类进行管理。

有时,在所有应用程序中都使用“singletons”一个单一的项目。有时,根据它的使用情况,有几个副本,被称为“实体”。

您可以在这里了解更多信息: http ://en.wikipedia.org/wiki/Object-Relational_Mapping

于 2011-12-14T20:45:36.860 回答