【发布时间】:2015-07-09 04:24:35
【问题描述】:
我正在构建一些包含数据库信息的类(在 PHP 中,尽管这个问题也扩展到其他 OOP 语言)。因此,我想创建一个接口:“可同步”。
interface syncable{
protected function _pushToDB();
protected function _pullFromDB();
}
我遇到的问题是我希望“可同步”也有一个(可能)永远不会改变的方法和变量:
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() 在大多数(如果不是全部)类之间将保持不变。
由于“users”、“foo”和“bar”等实现“syncable”的类与“syncable”没有真正的关系,可能需要扩展其他类,“syncable”应该是一个接口而不是一个抽象类。
所以我的问题是,实现这一目标的最佳方法是什么?我必须将我的 sync() 函数复制粘贴到每个实现“可同步”的类中吗?我是否创建了一个抽象类并希望没有扩展“可同步”的类需要扩展其他任何东西? (由于 PHP 和许多 OOP 不支持多重继承)是否有其他 PHP 解决方案更适合这种情况?有没有针对这个问题的通用 OOP 解决方案?
【问题讨论】:
标签: php class oop interface abstract