2014-08-31 55 views
0

我有這樣繼承的方法,而不從父要求參數

class Parent { 

public function add($query = "", $queryParams = []) { 
    if(empty($query)) { 
     $query = "blablabla"; 
    } 
    if(empty($params)) { 
     $params = [blablabla]; 
    } 
    //... some logic; 
    //return something; 
} 

} 

一類,我想有一個子類這樣

class Child extends Parent { 

public function add() { 
    $query = "blablabla"; 
    $params = [blablabla]; 
    return parent::add($query, $params); 
} 

} 

但它始終引發我一個錯誤說子類方法必須是「兼容的」,這意味着我必須聲明相同的參數。

我在想的東西像父聲明一個函數是這樣的:

public function __add($query = "", $params = []) {} 

,並在子類中聲明是這樣的功能:

public function add() { 
    $query = "blabla"; $params = [blabla]; 
    return parent::__add($query, $params); 
} 

的一個問題是,我仍然需要使用一些Parent類對象和方法add(),我並不總是隻使用繼承的類對象。

任何想法?

回答

1

雖然你可以忽略「嚴格」的消息,但是這是給出的一個原因:改變父方法的簽名是一件壞事,因爲它違反了着名的"Liskov Substitution Principle":一個Child類應該總是能夠替換它的Parent 。例如,如果您有類似

$p = new Parent(); 
$p->do_this() 
$p->and_that() 
$p->add(x,y) 

,如果你有

$p = new Child(); 

取代第一行代碼的其餘部分應該像以前一樣工作。顯然,更改簽名會導致它被打破。

在孩子中創建一種新方法,例如, addWithDefaults()或類似的,並且保留和睦的繼承add()

+0

你同意一個好的方法是聲明一個方法__doSomething($ params = []){}並在一個可能被稱爲doSomething()的子函數中調用它?就像我在問題 – JuanBonnett 2014-08-31 01:07:13

+0

@JuanBonnett中提到的:這取決於你。主要的是,如果參數不同,方法應該有不同的名稱。 – georg 2014-08-31 01:09:56

+0

謝謝,並感謝你的替代原則文章,非常有建設性! – JuanBonnett 2014-08-31 01:11:00