Я знаю, что я не могу распространяться на два класса, но какова альтернатива для моего случая?Попытка повторного использования кода, но не может расширить два класса, альтернативный?
Я использую базовый класс, parser
, который анализирует страницу моей CMS. Этот класс содержит все основные функции, необходимые для фильтрации данных, полученных из базы данных, и их преобразования в HTML-страницу.
Все остальные классы НУЖНЫ парсер, потому что без него они не работают.
У меня 2 режима:
- Внутри CMS
- за пределами CMS
Внутри CMS
Если внутри CMS, пользовательские данные и другие дополнительные данные загружены в класс.
Вне CMS
Если вне CMS, только необходимые данные для отображения загрузки страницы, это путь по умолчанию для отображения страниц для людей, которые посещают сайт.
модули
страница может быть использована для отображения данных/элементов по умолчанию, но он также может быть использован для отображения данных из модуля (например, страницы каландра). Если это случай, дополнительные данные должны быть загружены в объект синтаксического анализатора, и, таким образом, у меня есть 4 различных вариантов использования:
- режим анализатора
- режим cmsParser (внутри CMS)
- режим moduleParser (Синтаксический анализатор с данными модуля загружен)
- режим cmsModuleParser (оба)
у меня есть следующие [чрезвычайно упрощенный] классы:
class parser {
protected $oDataSource1;
protected $oDataSource2;
protected $oDataSource3;
//...
public function filterData() {
//.. Search through the data sources and return filtered data
}
}
class cmsParser extends parser {
protected $sUser_name;
protected $iUser_id;
protected $sUserLanguage;
///.. some functions here that are called only within the CMS
}
class moduleParser extends parser {
protected $mModuleData;
//.. Do something with this moduleData;
}
class cmsModuleParser extends ?? {
//... Get functions from the cmsParser + module functions
}
Единственное решение, которое я могу придумать, - использовать черту, которую используют модульParser и cmsModuleParser? Это не оптимальная ИМО, потому что мне все еще нужно добавлять повторяющиеся переменные и т. Д.
Я не хочу дублировать код, конечно, так как решить эту загадку?
Любая причина, по которой парсер загружает данные в себя и не просто возвращает объект данных, который может использоваться другими классами? Это позволит вам просто передать парсер-экземпляр любому классу, который ему нужен, и позволить ему анализировать столько вещей, сколько нужно для этого класса. – Erik
Основная причина использования класса парсера - инкапсулировать данные и иметь центральную точку для получения моих данных в последующих точках процесса синтаксического анализа. Вы можете включать фрагменты PHP на странице, и, сохраняя все данные в классе парсера, я сразу же знаю, что я могу или не могу использовать. – Abayob
Вы можете расширить класс, но реализовать несколько классов. Возможно, вам стоит попробовать использовать интерфейсы. –