繁体   English   中英

如何在依赖注入中使用PDO?

[英]How to use PDO with dependency injection?

我很难理解如何使用依赖项注入。 我在这里阅读了很多问题/答案,但是无法用我正在使用的代码来描述。

Model.php

abstract class Model {

    protected static function getDB() {
        static $db = null;

        if ($db === null) {
            $db = new PDO('mysql:host=host;dbname=dbname;charset=utf8', 'dbuser', 'password');
        }

        return $db;
    }
}

model.php仅包含该函数,我希望摆脱设置和静态调用它的过程。

user.php的

class User extends Model {

    /*
    * Selects all of the user information
    */
    public function getUser($id){

        $db = static::getDB();

        $sth = $db->prepare('SELECT * FROM user WHERE id = :id');
        $sth->bindValue(':id', $id, PDO::PARAM_INT);
        $sth->execute();

        return $sth->fetch();
    }

    /*
    * Selects all of the user posts
    */
    public function getUserPosts($id){
        $db = static::getDB();

        $sth = $db->prepare('SELECT * FROM user_posts WHERE user_id = :id');
        $sth->bindValue(':id', $id, PDO::PARAM_INT);
        $sth->execute();

        return $sth->fetch();
    }
}

在user.php中,我正在扩展模型类,但是我设置了$db = static::getDB(); 在每个功能中。

我知道依赖注入几乎只是将方法/变量传递给一个对象,但是我什至不确定自己是否正确地做到了。

更新后有更多想法:

我认为创建一个私有变量会更好,在构造函数中,我们将像这样调用getDB()

class User extends Model {

    protected $db;

    public function __construct(){
        $this->db = getDB();
    }

    /*
    * example usage
    */
    public function getUser($id){
        $sth = $this->db->prepare('SELECT * FROM user WHERE id = :id');
        $sth->bindValue(':id', $id, PDO::PARAM_INT);
        $sth->execute();

        return $sth->fetch();
    }
}

但是由于我不直接在函数构造函数中调用类,它是否仍算作依赖注入?

第二次更新:阅读了多本指南,并且使该页面更加有意义之后,这就是我想到的。

model.php

abstract class Model {
    protected $db = null;

    public function __construct(){
        if($this->db === null){
            try {
                $this->db = new PDO('mysql:host=' . Config::DB_HOST . ';dbname=' . Config::DB_NAME . '; charset=utf8', Config::DB_USER, Config::DB_PASSWORD);
                $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
                echo 'Connection failed: ' . $e->getMessage();
            }
        }
        return $this->db;
    }
}

user.php的

class User extends Model {

    protected $db;

    public function __construct(Model $db){
        $this->db = $db;
    }

    /*
    * example usage
    */
    public function getUser($id){
        $sth = $this->db->prepare('SELECT * FROM user WHERE id = :id');
        $sth->bindValue(':id', $id, PDO::PARAM_INT);
        $sth->execute();

        return $sth->fetch();
    }
}

看起来怎么样?

我认为您没有使用依赖注入,因为您实际上没有在模型中提供任何依赖,而是在构造函数上生成它们。

为了提供依赖性,您应该将其作为参数传递给构造函数:

public function __construct($db){
    $this->db = $db;
}

这样,您就可以从类中分离连接的创建,并且可以使用依赖注入的好处,例如传递Mock对象进行测试,而不是传递实际的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM