2013-07-24 79 views
0

我有這樣的代碼:爲什麼child方法必須具有與父方法相同的參數?

abstract class Base{ 

    public function delete(){ 
    // Something like this (id is setted in constructor) 
    $this->db->delete($this->id); 
    } 

} 

然後我有另一個類延伸基地,例如:

class Subtitles extends Base{ 

    public function delete($parameter){ 
     parent::delete(); 
     // Do some more deleting in transaction using $parameter 
    } 

} 

這也恰好有方法刪除。

這裏談到的問題:

當我打電話

$subtitles->delete($parameter) 

我得到:

Strict error - Declaration of Subtitles::delete() should be compatible with Base::delete() 

所以我的問題是,爲什麼我不能有後代與方法不同的參數?

謝謝你解釋。

回答

3

這是因爲PHP沒有方法覆蓋沒有方法超載。所以方法簽名必須完全匹配。

作爲工作以防萬一你的問題,你可以在重組你的基類中刪除,以

public function delete($id = null){ 
    // Something like this (id is setted in constructor) 
    if ($id === null) $id = $this->id; 
    $this->db->delete($id); 
} 

然後改變你的子類的方法簽名相匹配。

+0

+用於提供解決方法。 –

+0

那麼它比這更復雜,但我明白了。謝謝。 –

3

要覆蓋基類中的函數,方法必須具有與正在替換的方法相同的「簽名」。

簽名包含名稱,參數(和參數順序)和返回類型。

這是多態性的本質,是面向對象編程獲得其大部分功能的地方。如果您不需要重寫父級的方法,請爲您的新方法指定一個不同的名稱。

+0

不幸的是,我需要覆蓋的方法,因爲我想阻止: $ subtitles->刪除()只調用父類的方法。 但是,謝謝。 –

0

這是評論@ orangePill的插件,但我沒有足夠的評論聲望。

我對靜態方法有同樣的問題,我做了以下操作,使用late static binding。也許它有助於某人。

abstract class baseClass { 
    //protected since it makes no sense to call baseClass::method 
    protected static function method($parameter1) { 
     $parameter2 = static::getParameter2(); 

     return $parameter1.' '.$parameter2; 
    } 
} 

class myFirstClass extends baseClass { 
    //static value, could be a constant 
    private static $parameter2 = 'some value'; 

    public static function getParameter2() { 
     return self::$parameter2; 
    } 

    public static function method($parameter1) { 
     return parent::method($parameter1); 
    } 
} 

class mySecondClass extends baseClass { 
    private static $parameter2 = 'some other value'; 

    public static function getParameter2() { 
     return self::$parameter2; 
    } 

    public static function method($parameter1) { 
     return parent::method($parameter1); 
    } 
} 

使用

echo myFirstClass::method('This uses'); // 'This uses some value' 

echo mySecondClass::method('And this uses'); // 'And this uses some other value' 
相關問題