2014-03-27 50 views
0

如果我寫這篇文章的代碼PHP中Stricts Standarts,我一個不遵守:PHP嚴格標準:此代碼中的違規行爲是什麼?

class Readable {}; 
class Atom extends Readable {}; 

class Reader { 
    public function read(Readable $readable){} 
} 

class AtomReader extends Reader { 
    public function read(Atom $readable){} 
} 

PHP Strict standards: Declaration of AtomReader::read() should be compatible with Reader::read(Readable $readable) in php shell code on line 2 

的原理是什麼(如固體,...),在這裏失效?

注意:如果我是對的,這段代碼尊重Liskov原理

+0

您鏈接到已刪除的問題,這有什麼用? – Barmar

+0

@Barmar我認爲這是比我可見的其他人,對不起。 – bux

回答

0

簡單地說,里氏替換原則剛指出,繼承應該是它繼承滿足is-a關係類的邏輯部分。

至於嚴格的標準,PHP期望重寫的方法具有與其父代完全相同的簽名。在你的情況下,它只是一個不同type-hint。相反,您應該鍵入 - 提示兩個類都實現的接口。

class Reader { 
    public function read(ReadableAtomInterface $readable){} 
} 

class AtomReader extends Reader { 
    public function read(ReadableAtomInterface $readable){} 
} 
+0

因此,我的代碼符合SOLID原則,但不符合PHP嚴格標準,那就是了? – bux

+0

不知道SRP,DiP,OCP,因爲我只看到了該方法的單一原型。但在LSP方面 - 似乎是這樣.. – Yang

+0

關於你的代碼,它將不會更好的「ReadableInterface」?:class Reader {public function read(ReadableInterface $ readable){}}; class AtomReader extends Reader {public function read(ReadableInterface $ readable){}} – bux

0

如果是Reader::read(Readable $readable),那麼子類中的方法也必須使用Readable

class AtomReader extends Reader { 
    public function read(Readable $readable){} 
}