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 を使用してユーザーデータを取得する必要があります。これにより、DAO オブジェクトは、ユーザーデータを取得する必要があるたびに User クラスのインスタンスに依存する必要がなくなります。メソッド署名で提供されますか?

ありがとう。

4

2 に答える 2

1

クラス User のオブジェクトを提供することは、「依存性注入」と呼ばれます。私の観点からは、実際にそれを行うには良い方法です。そうすれば、クエリに使用するデータを決定するのは UserDAO クラスに任せることができます。

$user をコンストラクター経由ではなく、getUserData 関数のパラメーターとして使用しますが、それはおそらく私の個人的な好みです。

于 2012-09-09T11:11:03.307 に答える
1

User と UserDAO の両方が密結合していることがわかります。ユーザーには UserDAO があり、UserDAO には User クラスがあります。

DAO Design パターンでは、ドメイン オブジェクトまたは転送オブジェクトを提供するその DAO。

UserDAO を User クラスから削除し、 User オブジェクトを UserDAO クラスに渡して必要な操作を実行する方がよいと思います。

于 2012-09-09T15:52:31.820 に答える