2015-04-29 52 views
0

我正在構建一些類(在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解決方案?

回答

3

你應該看看php traits,您可以創建此特徵,然後徘徊無論你想/需要使用它們使用它們,就是多繼承原則的一部分:

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

+0

真的沒有PHP的其他答案。在PHP中缺乏多重繼承的特性本質上是一種解決方法。 –

+0

是的,它是一種變通方法,但我現在已經使用它們很多次了,從來沒有遇到任何麻煩,並且有機會集中很多代碼,而不需要從怪物抽象類繼承:D – taxicala

+0

沒有說這是一個不好的方法來使用。事實上,這是許多人都不知道的PHP中相當有用的功能。我應該也許會說這是PHP的(和其他具有特質結構的語言)回答多重繼承。 –