我正试图找出在不使用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'));