PDO和依赖项注入

麻利

我正在尝试找出在不使用singleton方法的情况下将PDO与其他类一起使用的最佳方法。我已经在这里搜索了数十个有关stackoverflow的问题,但是我仍然不清楚如何做到这一点。我了解显然依赖注入是要走的路,但是我不确定我是否理解它。这就是我想出的。

class MyPDO extends PDO {

    public function run($sql, $args = NULL) {
        $stmt = $this->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }

    public function addNew($table, $values) {
        $this->run('INSERT INTO ' . $table . ' (first_name) VALUES (?)', $values);
    }
}

class User {

    private $database = null;

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

    public function register($user) {
        $this->database->addNew('users', $user);
    }

}

$pdo = new MyPDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
$user = new User($pdo);
$user->register(array('name'));

我不确定这是否是一个好方法,或者我是否脱离基础。应该像现在一样在MyPDO类内部还是外部进行连接?另外,我想知道是否应该像现在这样在MyPDO类中插入用户到数据库中,还是应该在User类中创建一个函数以插入到数据库中。任何帮助表示赞赏。

你的常识

我就是写MyPDO“包装器”的那个人。要毫无疑问地回答您的问题,请执行以下操作:

我不确定这是否是一个好方法,或者我是否脱离基础。

是,很好。

应该像现在一样在MyPDO类内部还是外部进行连接?

最好在内部执行此操作,因为除了建立连接之外,您还必须添加一些配置选项

是否将用户插入数据库应该像现在一样在MyPDO类中

绝不-不!
试想一下,如果您要上十二堂课,那会是什么样子!

这样就可以了

class MyPDO extends PDO {

    public function __construct($dsn, $username, $password, $options) {
        $default_options = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false,
        ];
        $options = array_merge($default_options, $options)
        parent::__construct($dsn, $username, $password, $options);
    }

    public function run($sql, $args = NULL) {
        $stmt = $this->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}

class User {

    private $database = null;
    private $table = "users";

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

    public function register($user_data) {
        $this->database->run('INSERT INTO ' . $this->table . ' (first_name) VALUES (?)', $user_data);
    }
}

$pdo = new MyPDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
$user = new User($pdo);
$user->register(array('name'));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章