我是否正确实施了DAO?

时间:2012-09-09 11:05:42

标签: php mysql dao

我将在这里缩短真正的代码,以便快速完成。我已经拿出大量的支票和其他东西,只是为了让它更容易理解。

这是我的用户类:

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吗?

感谢。

2 个答案:

答案 0 :(得分:1)

提供类User的对象称为“依赖注入” - 有点。从我的角度来看,它实际上是一种很好的方法。这样,您可以将其留给UserDAO类来决定用于查询的数据。

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

答案 1 :(得分:1)

我看到User和UserDAO都是紧密耦合的。用户正在使用UserDAO,而UserDAO正在拥有用户类。

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

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