如何避免将Database对象传递给每个Model对象而不必使用全局变量?

时间:2015-01-26 20:05:39

标签: php oop design-patterns

为了避免全局变量或静态配置类,我在实例化它时将数据库对象传递给我的每个模型:

$user = new User( App::getDatabase() );
if( !$user->loggedIn() ) doSomething();

App是一个有静态成员的类。

这非常麻烦,但唯一的选择是在模型类中使用静态类(或全局变量):

class User extends Model {

    function loggedIn() {
        $database = App::getDatabase();
        $database->query('stuff');
        // you get the picture
    }
}

但这就像使用全局变量一样。

另一个想法是将数据库传递给每个模型继承自的父类:

class Model {
    protected static $database

    public static function setDatabase($database) {
        $this->database = $database;
    }

    // more stuff here
}

class User extends Model {

    function loggedIn() {
        parent::$database->query('stuff');
        // you get the picture
    }
}

Model::setDatabase($myDatabase);
编辑:我刚刚意识到这最后一个例子使我的所有模型都依赖于一个数据库。我无法通过这种方式使用多个数据库...可能是一个严重的限制。

然而,我是PHP的新手,我还没有尝试过。

这是个好主意吗?那里有替代品吗?

1 个答案:

答案 0 :(得分:0)

代码中的某处......

Model::$database = App::getDatabase();

您不需要在每个对象上设置它,因为您继承自Model。