2011-11-03 93 views
1

擁有2種展示方式的證書dispayAsXMLdisplayAsHtml。 我想創建2個新類和GuaranteeCertificate這兩個都有其他屬性。如何擴展這個類?

我應該提取一個包含這些屬性並從抽象類3新類繼承的抽象類,或者我可以保留這個證書類,並從中擴展新的類?使用新屬性並覆蓋新類中的displayAsXML abd displayAsHtml方法?

class Certificate { 
     private $isin; 
     private $tradingMarket; 
     private $currency; 
     private $issuer; 
     private $issuingPrice; 
     private $currentPrice; 
} 
+0

也許神奇的方法__set和__get是值得關注的,你可以通過使用__set和__get方法來操作變量範圍 –

+0

也許你能解釋一下你需要達到什麼目的? – Marcx

+0

是否有關自動刷新數據的問題?如果這是個問題,我會嘗試使用AJAX每隔X秒更新一次(new $ object)對象。 (谷歌提供了關於AJAX的大量英特爾信息)如果你想創造一個價格歷史並且想要存儲它:使用一個數據庫,或者創建一個以時間爲關鍵的巨大數組。您希望用戶如何發佈此文檔?你的服務器在哪裏得到它?你也可能想添加一些額外的類和方法。 (例如一個文檔類,告訴關於你的文檔的所有內容)如果是關於計算所有這些?經濟?東西 - >我不能 – NikM

回答

2

如果您不希望類自身的實例存在,那麼可以創建一個類抽象。所以,你可以創建一個證書類是這樣的:

abstract class Certificate 
{ 
    protected $isin; 
    protected $tradingMarket; 
    protected $currency; 
    protected $issuer; 
    protected $issuingPrice; 
    protected $currentPrice; 

    abstract public function displayAsXML(); 
    abstract public function displayAsHtml(); 
} 

的變量必須得到保護,否則類的decendants無法訪問它們。如果沒有必要,請保持私密。該abstract public function■找到由從這個基類擴展類中重寫:

class BonusCertificate extends Certificate 
{ 
    protected $bonus; 

    public function displayAsXML() 
    { 
     // Do your thing 
    } 

    public function displayAsHtml() 
    { 
     // Do your thing 
    } 
} 

所以你最終有三個班,第三個是GuaranteeCertificate和看起來像BonusCertificate。

如果您還需要「常規」證書實例存在,只需從類和函數定義中刪除abstract,然後在Certificate類中適當地創建displayAsXMLdisplayAsHtml函數體。您仍然可以在派生類中重寫這些函數。

另請嘗試閱讀關於此的documentation

+0

你的第一個代碼片段包含錯誤:非抽象類可能不包含PHP中的抽象方法。 –

+1

我已經修好了,但謝謝。 :-) – CodeCaster

0

你問自己是否會出現證書類的實例。如果這是允許的,那麼不要使用抽象。如果阻止,則使用抽象。

而且重命名類ICertificate代替證明書以證明它是一個接口

+1

抽象類是* not *接口,它們是兩種不同的工具。抽象類可以有實現,而接口不能。由於這種區分,不需要更改/添加類名前綴,儘管提高'instanceof'運算符的可讀性可能是一個很好的慣例。然而,這樣的命名約定對PHP的功能沒有任何影響。另見:[PHP中的接口](http://php.net/manual/en/language.oop5.interfaces.php)和[PHP中的抽象](http://php.net/manual/en/language。 oob5.abstract.php) –

+1

Bob叔叔說:*如果你用我的接口作爲前綴,問問你自己爲什麼要你的客戶知道它是一個接口。爲什麼這對他們很重要?* [source](https://twitter.com/#!/unclebobmartin/status/131376415328309249) – Gordon

+0

@PelletenCate,我明白你的意思了。謝謝你的提示 –

0

你讓一個抽象類,如果它是不完整的,你永遠不希望自己的類的實例存在。

但首先你定義證書的接口:

interface Certificate 
{ 
    public function displayAsXML(); 
    public function displayAsHtml(); 
} 

所以,你可以創建一個證書基類是這樣的:

abstract class BaseCertificate implements Certificate 
{ 
    protected $isin; 
    protected $tradingMarket; 
    protected $currency; 
    protected $issuer; 
    protected $issuingPrice; 
    protected $currentPrice; 
} 

的變量必須得到保護,否則階級的後代不能訪問他們(而抽象的階級不會使用他們)。如果沒有必要,請保持私密(如果完全不使用,則將其刪除)。在interfacce定義的公共function`s必須由從這個基類擴展類來實現:

class BonusCertificate extends BaseCertificate 
{ 
    protected $bonus; 

    public function displayAsXML() 
    { 
     // Do your thing 
    } 

    public function displayAsHtml() 
    { 
     // Do your thing 
    } 
} 

所以你最終有三個班,第三個是GuaranteeCertificate和看起來像BonusCertificate。

不過,若你還需要「常規」證書情況存在,只需刪除從基類的abstract並實現功能的定義,然後將displayAsXMLdisplayAsHtml函數體適當納入證書渲染類,因爲顯示器不屬於到對象類型本身的數據域。

然後將一個類型屬性添加到證書基類,以便您可以在不同類型的證書之間有所不同。

另請嘗試閱讀關於此的documentation