2012-12-15 15 views
2

在其他面向對象的語言如Java,我們可以覆蓋功能,可以使用關鍵字/註解像implements@override在PHP中重寫?

有沒有辦法在PHP這樣做呢?我的意思是,例如:

class myClass { 
    public static function reImplmentThis() { //this method should be overriden by user 
    } 
} 

我希望用戶自己實現myClass::reImplementThis()方法。

我如何能做到這一點在PHP?如果有可能,我可以選擇嗎?

我的意思是,如果用戶不實施該方法,我可以指定一個默認方法,或者我可以確定該方法沒有定義(我可以使用method_exists來做到這一點)嗎?

+2

這正是繼承是。 http://php.net/manual/en/language.oop5.inheritance.php –

+2

一般來說,我會做非靜態的,然後用戶可以擴展myClass - 選擇是否重新定義'reImplmentThis( )'。如果您的默認實現可接受,則不需要測試用戶實現的存在。 – halfer

+1

您可以使用抽象類來擴展(如halfer所說)和一個接口類(http://www.killerphp.com/articles/php-interfaces/),以確保最終的類至少具有函數你指定的。我只是剛剛學習這些(接口),我可能是錯的,但從我讀過的內容來看,似乎是得到它們的原因。 – qooplmao

回答

1
<?php 
abstract class Test 
{ 
    abstract protected function test(); 

    protected function anotherTest() { 

    } 
} 

class TestTest extends Test 
{ 
    protected function test() { 

    } 
} 

$test = new TestTest(); 
?> 

這樣TestTest類必須覆蓋功能測試。

+1

在OP的情況下,'reImplementThis()'將被聲明爲非抽象的,因爲默認實現是可以的。但是,+1。 – halfer

+0

@Dillen這不是用戶問的問題的答案,這只是它應該如何完成的一個變體,但不能滿足用戶的要求 – pal4life

0

是的,有。您可以選擇通過擴展該類並定義一個具有基類中名稱,函數簽名和訪問說明符(公共或受保護)的方法來覆蓋方法。該方法不應在基類中聲明爲抽象類型,否則將需要在派生類中實現該方法。在您例如,它會是這個樣子:

class MyClass { 
    public static function reImplmentThis() { //this method should be overriden by user 
    } 
} 

class MyDerivedClass extends MyClass { 
    public static function reImplmentThis() { //the method you want to call 
    } 
} 

如果用戶沒有覆蓋它,MyDerivedClass仍會有一個reImplmentThis()方法中,一個從MyClass的繼承。

這就是說,你需要從你的派生類中調用擴展的靜態方法時留出了事要非常小心。我鼓勵你重構你的代碼來擴展實例方法,除非你有特別的需要擴展靜態類。如果您決定沒有比擴展靜態類更好的方法,請務必明白Late Static Binding

是,它可以檢查方法的實現與否和獲得的信息一大堆更多有關使用PHP Reflection類。