Изменение родительского класса на дочерний класс в зависимости от параметров конструктора - PullRequest
0 голосов
/ 10 октября 2018

У меня есть класс базы данных, в который вы передаете имя таблицы в конструктор, например:

$customer =  new Dao("customer");

Существуют также специализированные дочерние классы для нескольких таблиц, которые имеют специальное поведение, например:

class customerDao extends Dao{}

Причина этого в том, что если кто-то вводит клиента, есть определенная логика, которую я хочу сделать каждый раз заранее.

Моя цель - разрешить класс Daoиспользоваться для большинства таблиц, но вынудить программиста использовать один из этих дочерних классов, если таблица соответствует им.Я хочу убедиться, что если кто-то создаст объект класса Dao и передаст имя таблицы, соответствующее одному из этих дочерних классов, он будет создавать экземпляр дочернего класса, так что невозможно вставить клиента беззапустить этот логический код заранее.Есть ли способ сделать это?

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

1 Ответ

0 голосов
/ 11 октября 2018

Поскольку ничего не может быть возвращено из __construct() Я думаю, что единственный способ заставить это работать - использовать статический метод для создания вместо new.Вы можете динамически проверять существование класса, чтобы избежать необходимости хранить список таких классов и их имя таблицы.

class Dao {
    public $table;
    public function __construct($table) { $this->table = $table; }
    public function whatami() { echo get_class($this) . "\n"; }
    public function gettable() { echo "$this->table\n"; }
    public static function create($table) {
        $cn = "${table}Dao";
        return class_exists($cn) ? new $cn() : new Dao($table);
    }
}

class customerDao extends Dao {
    public function __construct() { $this->table = "customer"; }
}

$foo = Dao::create("foo");
$foo->whatami();
$foo->gettable();
$bar = Dao::create("customer");
$bar->whatami();
$bar->gettable();

Вывод:

Dao
foo
customerDao
customer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...