如何避免将数据库对象传递给每个模型对象,而不必使用全局变量


How to avoid passing Database object to each Model object without having to use global variables?

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

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

应用是具有静态成员的类。

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

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的新手,我还没有尝试过这个。

这是个好主意吗?还有其他选择吗?

在你的代码中的某个地方....

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

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