2017-07-31 118 views
-2

我有兩個類,如下所示:OOP兼容性錯誤

<?php 

abstract class A { 

    public function update(array $one, array $two) { 
     echo $one; 
     echo $two; 
    } 
} 
?> 

則B繼承了A類:

<?php 
include ("A.php"); 
class B extends A { 
public function update(array $one) { 
    $two = array(
     "foo" => "bar", 
     "bar" => "foo", 
    ); 
    parent::update($one, $two); 
} 
} 
?> 

當我嘗試編譯B,我得到以下錯誤:

Declaration of B::update(array $one) should be compatible with A::update(array $one, array $two) in B.php on line 3

很明顯,B :: update存在問題。我正在給A :: update兩個數組。但不知何故,我失去了一些東西。 我試圖在構造函數中進行初始化。我也嘗試手動添加第二個數組到A :: update(parent :: update),但我似乎得到相同的錯誤。 有沒有人有一個想法,爲什麼我得到這個問題?我的PHP版本:v7.0.18提前

+3

您將'A()'定義爲需要抽象類中的兩個參數,然後嘗試定義它在您的類中具有兩個繼承自它的參數。你不能那樣做。 –

+0

但是由於簽名不一樣,我不清楚自己是否試圖覆蓋它本身?令人煩惱的是,這個確切的代碼之前已經有效。但是,因爲我跳到我現在的PHP版本,我得到這個錯誤。 –

+1

錯誤一直存在,您剛剛在以前的PHP配置中將其壓制。而PHP只能通過名字來識別功能;您沒有兩種方法可以覆蓋該方法。 – deceze

回答

2

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

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

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

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

+0

我是一個PHP新手。出於這個原因,我不知道,在PHP上重載是不可能的。我只是改了名字,現在我已經沒有錯誤了。 –

+0

反正你可以通過__call()或func_get_args()的幫助實現重載。但不推薦__call(),大多數現代語言不允許重載。希望有所幫助。請參閱此鏈接瞭解更多信息:http://www.php.net/manual/en/language.oop5.overloading.php –

1

PHP是想指出的問題
由於是這樣的:

function caller(A $a) { 
    $a->update($foo, $bar); 
} 

caller(new B); 

由於B extends ABinstanceof A。對A鍵入提示的任何代碼也將接受B,,並且期望界面相同。這就是爲什麼接口應該兼容。