Php 我是否正在实现我的DAO';对吗?

Php 我是否正在实现我的DAO';对吗?,php,mysql,dao,Php,Mysql,Dao,我将把真正的代码缩短很多,只是为了让它更快。我拿了很多支票和其他东西只是为了让它更容易理解 这是我的用户类: class User { private $userId; private $userDAO; public function __construct($dbh, $userId) { $this->userId = (int) $userId; //Create the UserDAO object $

我将把真正的代码缩短很多,只是为了让它更快。我拿了很多支票和其他东西只是为了让它更容易理解

这是我的用户类:

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从用户类的实例中获取用于数据库查询的变量,因此DAO方法不需要任何参数

我的getUserData()方法是否应该有一个userId参数,并使用提供的userId来获取userdata,这样DAO对象就不需要每次都依赖用户类的实例来获取用户数据,因为在方法签名中可以提供任何userId


谢谢。

提供类用户的对象称为“依赖项注入”——有点像。在我看来,这实际上是一个很好的方法。这样,您就可以让UserDAO类决定使用哪些数据进行查询


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

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

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


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

我在想,如果在另一个类中,通过某种随机方法中途检索到一个userId,并需要获取一些用户的详细信息,会怎么样。我必须创建一个用户对象,这将创建UserDAO,这将获取数据,在User对象中设置它,然后我将访问它。我在想,如果我可以在getUserData()方法中添加一个userId参数,那么在不创建用户对象的情况下检索数据的速度会更快,那么就太麻烦了。我只是想也许UserDAO方法不应该用于用户类的实例,而应该是静态方法?当然,你是对的,有时候只传递用户id会更轻量级,但它不一定是最好或最优雅的。考虑以下事项:在传递用户对象时,在DAO中的查询中使用哪些值并不重要,因此,无论DAO中的更改是什么,只要数据包含在用户对象中,并且除了UserDAO之外,您不必更改代码,它就可以工作-但是如果您只是传递id,并且在查询中突然需要用户名,您必须更改该方法的每次调用,并传递用户名而不是id。如果您对依赖项注入的更多信息感兴趣:Fabien Povertier写了一篇关于它的有趣文章:(但是,他们在symfony2框架中使用的方法有些偏颇-尽管仍然非常好)但是,我不是每次想做数据库工作时都必须创建一个新的UserDAO对象吗?当我在一个用户方法中创建一个UserDAO对象,然后该方法调用用户类中的另一个方法,并且需要做一些数据库工作时,我不是必须在该方法中重新创建UserDAO对象吗,除非已经创建的UserDAO对象在其签名中传递给它?还是我误解了你?有两种方法可以让事情变得更好。您引入了工厂类,它将创建DAO对象。在factory中,您可以为每个请求决定是要保留once intance、实例池还是新实例。除此之外,您的DAO对象还必须由业务层即服务层使用。所以,要执行用户对象的任何操作,您的服务或业务层应该调用DAO对用户对象执行操作。