我是否正在实现我的DAO';s正确


Am I implementing my DAO's correctly?

我将在这里缩短实际代码很多,只是为了让它更快。我拿出了大量的支票和其他东西,只是为了让它更容易理解。

这是我的用户类:

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都可以在方法签名中提供?

谢谢。

提供User类的对象称为"依赖注入"-kinda。从我的角度来看,这实际上是一个很好的方法。这样,就可以由UserDAO类来决定要使用哪些数据进行查询。

尽管我会使用$user作为getUserData函数的参数,而不是通过构造函数——但这可能只是我个人的偏好。

我发现User和UserDAO都是紧密耦合的。User具有UserDAO,UserDAO具有User类。

在DAO设计模式中,它的DAO提供域对象或传输对象。

我认为更好的方法是从User类中删除UserDAO,然后将User对象传递给UserDAO类以执行必要的操作。