我将在这里缩短真正的代码,以便快速完成。我已经拿出大量的支票和其他东西,只是为了让它更容易理解。
这是我的用户类:
class User {
private $userId;
private $userDAO;
public function __construct($dbh, $userId) {
$this->userId = (int) $userId;
//Create the UserDAO object
$this->userDAO = new UserDAO($dbh, $this);
//Get the up to date details of the user
$userData = $this->userDAO->getUserData()
}
}
这是我的UserDAO课程:
class UserDAO {
private $dbh;
private $user;
public function __construct($dbh, $user) {
$this->dbh = $dbh;
$this->user = $user;
}
public function getUserData() {
$stmt = $this->dbh->prepare("SELECT username FROM " . USERS_TABLE . " WHERE userId = :userId LIMIT 1");
$stmt->bindParam(':userId', $this->user->getUserId(), PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
这是正确的方法吗?正如您所看到的,DAO从User类的实例获取数据库查询的变量,因此DAO方法不需要任何参数。
我的getUserData()方法是否有userId的争论,并使用提供的userId来获取userdata,这样DAO对象每次需要获取用户数据时都不需要依赖User类的实例可以在方法签名中提供任何userId吗?
感谢。
答案 0 :(得分:1)
提供类User的对象称为“依赖注入” - 有点。从我的角度来看,它实际上是一种很好的方法。这样,您可以将其留给UserDAO类来决定用于查询的数据。
虽然我会使用$ user作为getUserData函数的参数,而不是通过构造函数 - 但这可能只是我个人的偏好。
答案 1 :(得分:1)
我看到User和UserDAO都是紧密耦合的。用户正在使用UserDAO,而UserDAO正在拥有用户类。
在DAO设计模式中,它的DAO提供域对象或传输对象。
我认为更好的方法是从User类中删除UserDAO,然后将User对象传递给UserDAO类以执行必要的操作。