我有一个理论问题,我希望有人能帮助我弄明白.
我目前正在使用MVC设计模式在PHP中编写一个简单的Web应用程序.我已经看过并阅读了一些关于这个主题的教程,但它们通常要么过于复杂,要么过于简单.
所以我目前所拥有的是一个简单的用户模型:
class User {
private $username;
private $group; //user, admin, etc
// getters
}
我还有一个简单的Database类来实现这个类:
interface DatabaseInterface {
public function connect();
public function disconnect();
public function prepare($sql = null);
public function execute($params = array());
public function rowCount();
public function fetch();
}
我的问题是我应该如何通过填充我的User类链接这个Database类?
我目前所拥有的是另一个名为UserDAO的类,它在它的构造函数中传递了Database类的引用,它有一个名为ValidateUser()的函数,然后使用上面的接口方法来检查用户对数据库.
class UserDAO {
private $database;
public function __construct($database) {
$this->database = $database;
}
public function validateUser($username, $password) {
$this->database->prepare('SELECT * FROM users WHERE...');
....
return true/false;
}
}
现在我通过构造函数将UserDAO对象传递给User类,并在User类中添加另一个ValidateUser()方法,它基本上只调用UserDAO类中的ValidateUser()方法.
新的User类:
class User {
private $username;
private $group; //user, admin, etc
private $userDAO;
public function __construct($userDAO) {
$this->userDAO = $userDAO;
}
public function validateUser($username, $password) {
if($this->userDAO->validateUser($username, $password)) {
// set stuff that i need
return true;
}
return false;
}
// getters
}
关于这一点对我来说感觉不对.有人能帮我理解这个过程通常流动的方式吗?
此外,Database类通常保持静态,所以我可以使用Database :: instance()之类的东西调用连接吗?现在我正在PHP页面的开头创建一个数据库对象并传递它.
如果有什么不清楚的话,请随时给我发表评论,我会尽快修复它.
感谢您对帖子的长度感到满意. 解决方法: 这取决于您的解决方案应该是最新的.
独生子
“最旧的”版本是在任何地方都有一个静态连接.你通过使用单例来实现这一点:
class database {
private $instance = NULL;
private function __construct()
public function getDb() {
return $this->instance?: $this->instance = new database();
}
}
注册处
第二个更新的解决方案是使用注册表: 您可以拥有一个由所有其他类扩展的基类,并为像这样的调用提供方法
$this->getRegistry()->getDb
通常,注册表在脚本的开头填充,例如在引导程序中. 优点是您可以更好地对组件进行单元测试,因为没有静态部件,您可以为开发和生产环境定义不同的注册表……
依赖注入
依赖注入的第三个“最新”和最好的方法. 通常你会有一些框架为你做这件事.这个想法是,无论何时调用类的构造函数,所有依赖项(如数据库连接)都由框架注入.
这样您就可以轻松定义“用户需要DB和Redis.商店需要DB,Config和FTP”…… 虽然这对于较小的项目来说是一个开销,但它对于大量且经过充分测试的项目有很大帮助.
如果您曾经升级到多个DB(例如一个主服务器和多个服务器),DI非常适合,因为您可以为代码的每个部分提供完成工作所需的数据库,而无需更改单行代码. (编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|