PHP классы Дао наследовать от универсального классов DAO и только измените имя таблицы


Я строю веб-приложение, которое должен получить доступ к различных таблиц в данной БД MySQL. Для этого я создал универсальный класс, см. DAO_DBRecord.php ниже, и я создам детей классы для каждой таблицы я хочу получить доступ к, например, DAO_User.php используется для доступа к пользователям столом. Разница только в занятиях с детьми, это то, что я изменить значение переменной, которая содержит имя таблицы, я хочу открыть.

Мои вопросы:
1 - я должен принять DAO_DBRecord.php класс абстрактный? Я не планирую, чтобы инстанцировать его, и в самом деле, как написано, Я не могу получить доступ к любому столу.
2 - должен ли я использовать константы DAO_DBRecord.php класса (например, константные USER_TABLENAME = 'пользователи'; строительства ARTICLE_TABLENAME = 'статьи';) и ссылаться на них в занятиях с детьми (например, частная конюшня = USER_TABLENAME;)?
3 - Что еще я должен делать?

Class_DB.php:

<?php
    class DB {
        private $dbHost;
        private $dbName;
        private $dbUser;
        private $dbPassword;

        function __construct($dbHost, $dbName, $dbUser, $dbPassword) {
            $this->dbHost=$dbHost;
            $this->dbName=$dbName;
            $this->dbUser=$dbUser;
            $this->dbPassword=$dbPassword;
        }

        function createConnexion() {
            return new PDO("mysql:host=$this->dbHost;dbname=$this->dbName", 
                        $this->dbUser, $this->dbPassword);
        }
    }
?>

DAO_DBRecord.php

<?php
    require_once('Class_DB.php');

    class DAO_DBrecord {
        private $dbh; // This is an instance of Class_DB to be injected in the functions.
        private $table=NULL;

        function __construct($dbh){
            $this->dbh=$dbh;
        }
        function dbConnect(){
            $dbConnection=$this->dbh->createConnexion();
            return $dbConnection;
        }
        function checkRecordExists($recordIdentifier, $tableColName){
            $dbConnection=$this->dbConnect();
            $query=$dbConnection->prepare("SELECT COUNT(*) FROM $table "
                . "WHERE $tableColName = :recordIdentifier");
            $query->bindParam(":recordIdentifier", $recordIdentifier);
            $query->execute();
            $result=$query->fetch(PDO::FETCH_ASSOC);
            if ($result["COUNT(*)"]>0){
                return true;
            } else return false;
        }
    }
?>

DAO_Users.php

<?php
    class DAO_User extends DAO_DBRecord {
        private $table='users';
    }
?>


2814
2
задан 15 декабря 2011 в 11:12 Источник Поделиться
Комментарии
1 ответ

Если единственное различие между подклассами DAO_DBRecord - это имя таблицы, я бы не использовать подклассы. Я просто передать имя таблицы в конструктор DAO_DBRecord и использовать различные экземпляры для разных таблиц.

Если единственное различие между подклассами DAO_DBRecord - это имя таблицы, я хотел бы передать имя таблицы в конструктор родительского класса:

class UserDao extends DAO_DBRecord {

public function __construct($db) {
parent::__construct($db, 'users');
}
}

Имеющих различные классы улучшает безопасность типов. В Java вы не можете пройти UserDao методу с ArticleDao параметр(1), он не компилируется. Я не знаю, является ли этот вид защитного типа существует в PHP или нет, но это может быть хорошей практикой и может результаты более читабельный код.

(1) Конечно, если UserDao является подклассом ArticleDao


Я не чувствую, что делать DAO_DBRecord класс аннотация может сделать большую разницу. Если ваш клиент хочет злоупотреблять класса они могут создать муляж (неабстрактные) подкласс для этого:

class AnyDao extends DAO_DBRecord {

public function __construct($db, $tableName) {
parent::__construct($db, $tableName);
}
}

Если вы хотите защитить DAO_DBRecord от экземпляра с неизвестными имена таблиц сделать свой конструктор частная и создавать статические функции-фабрики для таблиц внутри DAO_DBRecord:

class DAO_DBrecord {
private $db;
private $tableName;

private function __construct($db, $tableName) {
$this->db = $db;
$this->tableName = $tableName;
}

public static function createUserDao($db) {
return new DAO_DBrecord($db, 'users');
}

public static function createArticleDao($db) {
return new DAO_DBrecord($db, 'articles');
}
...
}

Так, DAO_DBrecord не может быть использован с другими таблицами.


Если вы используете ваши имена таблиц только после создания константы для них выглядит лишним в этом случае.

2
ответ дан 16 декабря 2011 в 12:12 Источник Поделиться