我正试图找出在不使用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类中插入一个用户到DB中,或者是否应该在user类中创建一个函数来插入到DB中。如有任何帮助,我们将不胜感激。

最佳答案

我就是那个写了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'));

08-16 22:03