Отказ от ответственности: Это не домашняя работа. Кроме того, я описываю упрощенную ситуацию, так что соблюдайте мой полупсудо-код.
Мне кажется, что это довольно стандартная ООП-ситуация, но я не уверен, что это лучший способ справиться с этим. Допустим, у меня есть 3 класса: Base
, A
и B
. Класс A
расширяется Base
и B
расширяется A
. Конструктор класса Base
выполняет запрос к базе данных, который извлекает различные метаданные, определенные в массиве. Смотрите ниже:
Class Base {
public $meta_data = array('col1','col2');
function __construct() {
$db->query("select ".join(',',$this->meta_data)." from table");
}
}
Class A extends Base {
public $meta_data = array('col3','col4');
function _construct() {
parent::__construct();
}
}
Class B extends A {
public $meta_data = array('col5','col6');
function _construct() {
parent::__construct();
}
}
Когда я создаю объект new B()
, я хочу, чтобы sql-запрос базового конструктора выглядел так:
select col1, col2, col3, col4, col5, col6 from table;
И когда я создаю объект new Base()
, я хочу, чтобы SQL-запрос выглядел так:
select col1, col2 from table;
Теперь ... Я технически знаю, как это сделать (возможно, грубо), но мне любопытно, каков правильный путь без слишком большой репликации кода и с учетом гибкости в будущем (то есть, добавляя подкласс из б). Мне нужно объединить массивы $meta_data
на каждом уровне наследования вплоть до конструктора в классе Base
.
Есть идеи?