Я строю некоторые классы (в PHP, хотя этот вопрос распространяется и на другие языки ООП), которые хранят информацию из базы данных. Поэтому я хочу создать интерфейс: «синхронизируемый».
interface syncable{
protected function _pushToDB();
protected function _pullFromDB();
}
Проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы у syncable также был метод, который (вероятно) никогда не изменяется, и переменная, с которой нужно идти:
protected $sync = 0;
public function sync(){
if($this->sync == 0){
// DB in sync with class; Do nothing.
}
if(this->sync == 1){
$this->_pushToDB();
$this->sync = 0;
}
if(this->sync == -1){
$this->_pullFromDB();
$this->sync = 0;
}
}
Когда переменные изменяются в реализованном классе или база данных обновляется в другом месте, переменная $ sync обновляется, чтобы должным образом отражать необходимый тип синхронизации, тогда в какой-то момент может быть вызван sync (), который, в свою очередь, вызывает соответствующий реализованный метод. Хотя _pushToDB () и _pullFromDB () очень специализированы для каждого класса, sync () останется неизменным между большинством, если не всеми классами.
Поскольку классы, реализующие «syncable», такие как «users», «foo» и «bar», не имеют реального отношения к «syncable» и могут нуждаться в расширении других классов, «syncable» должен быть интерфейсом, а не абстрактным классом.
Итак, мой вопрос: как лучше всего это сделать? Должен ли я скопировать и вставить мою функцию sync () в каждый класс, который реализует «syncable»? Создаю ли я абстрактный класс и надеюсь, что никакой класс, расширяющий «syncable», никогда не будет нуждаться в расширении чего-либо еще? (Поскольку PHP и многие ООП не поддерживают множественное наследование) Есть ли какое-то другое решение PHP, которое бы лучше подходило для этой ситуации? Существуют ли общие решения ООП для этой проблемы?
Вы должны взглянуть на php traits
, вы можете создать эти черты и затем использовать их там, где вы хотите / нуждаетесь в них, является частью принципа множественного наследования:
Других решений пока нет …