【问题标题】:Concrete Methods in Interface Classes接口类中的具体方法
【发布时间】: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


    【解决方案1】:

    你应该看看php traits,你可以创建这个特性,然后在任何你想要/需要使用它们的地方使用它们,这是多继承原则的一部分:

    http://php.net/manual/en/language.oop5.traits.php

    【讨论】:

    • PHP 真的没有其他答案。由于 PHP 中缺乏多重继承,trait 本质上是一种解决方法。
    • 是的,它是一种解决方法,但我已经使用它们很长时间了,从来没有遇到任何麻烦,并且有机会集中大量代码而无需继承一个怪物抽象类:D
    • 并不是说这是一种不好的使用方法。事实上,它是 PHP 中一个非常有用的功能,很多人都不知道。我应该说这是 PHP(以及其他具有类似 trait 结构的语言)对多重继承的回答。
    • 是的,它不是一个非常知名的功能,但正如你所说,它非常有用:)
    • 所以看起来一个特征类似于只做一个“include traitFile.php” - 或多或少会发生什么? (即:我不能制作“同步”特征并在界面内“使用”它,对吗?)
    猜你喜欢
    • 1970-01-01
    • 2013-04-04
    • 2016-03-15
    • 1970-01-01
    • 2020-06-09
    • 2016-07-23
    • 2017-09-25
    • 2011-05-01
    • 2016-10-26
    相关资源
    最近更新 更多