0

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

这是我的用户类:

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

谢谢。

4

2 回答 2

1

我看到 User 和 UserDAO 都是紧密耦合的。用户拥有 UserDAO 并且 UserDAO 拥有 User 类。

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

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

于 2012-09-09T15:52:31.820 回答
1

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

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

于 2012-09-09T11:11:03.307 回答