2013-03-08 53 views
0

我對PHP OOP相當陌生,而且出現錯誤。object :: method()必須與objectAbstract :: method()的兼容 - 傳遞parameter = value?

objectForm ::方法addMessage()必須與objectAbstractForm ::方法addMessage()在/www/form/Form.php的上線XX

我已經看到了這幾次,其中方法的參數是兼容比如$ VAR1,$ VAR2 =虛假(或空),不管是什麼原因,我得到「必須與X的:: Y()兼容」

public function addMessage($message, $messageType = 'info') 
{ 
    if (!in_array($message, $this->_messages)) { 
     if ('info' == $messageType) { 
      $this->_messages[] = $message; 
     } else { 
      $this->_errorMessages[] = $message; 
     } 
    } 
} 

因爲我在OOP是相當新的,我不能找出一個更好的辦法。

編輯:在父有例如,

abstract class objectAbstractForm { 

abstract protected function addMessage($message, $messageType); 

} 

什麼是更好的方式來做到這一點?我使用PHP 5.2.17

+0

提供父級addMessage()的函數定義。我的猜測是你的參數計數不匹配。 – 2013-03-08 18:57:54

+0

謝謝傑森,忘記了 - 編輯後。 – r109 2013-03-08 19:09:42

回答

1

我想象你的類延伸的另一(從它的延伸/www/form/Form.phpobjectForm錯誤消息),爲objectAbstractForm::addMessage()(你的方法張貼在這裏)的方法簽名必須是相同的objectForm::addMessage()

例如:

class A { 
    public function test($a, $b, $c=null) { 
     // code 
    } 
} 


class B extends A { 
    public function test($a, $b, $c=null) { 
     // code 
    } 
} 


class C extends A { 
    public function test($a, $b=null) { 
     // code 
    } 
} 

C將產生的誤差,該方法C::test()的簽名是從在該方法中A::test()簽名不同,而B::test()將接受的,因爲它的簽名是相同的A::test()

我會更樂意讓我的回答更具體到你的問題,但你需要張貼objectForm::addMessage()方法簽名和兩個objectAbstractFormForm

編輯類簽名:我有我猜測你的類的方式是相反的,但原理是一樣的,你不能在PHP 5.2中有不匹配的參數。您需要根據自己的喜好編輯簽名。

或者,您可以升級到PHP 5.3或更高版本,這不會讓你煩惱。

HTH

PS:我不知道,如果我使用的是正確的術語,當我說「方法簽名」,但如果我錯了,請隨時指正:)

+0

對不起,我忘了包含父例子。將其置於原始帖子中的「編輯」下。 – r109 2013-03-08 19:10:05

+1

更新了我的答案。 – 2013-03-08 19:22:53

+0

感謝您的更新編輯。你和dnagirl的迴應都是有道理的。現在你提到它了,我忽略了在這臺服務器上升級到PHP 5.3。 我會採納你的建議,並確保這不會出現在其他可能運行的實例5。2歲或以上。 :] – r109 2013-03-08 21:21:04

2

問題是你已經在子類中使第二個參數成爲可選的,但是它在父類中是必需的。如果你想要一個可選的參數,你還需要在父類中使它成爲可選的。

+0

謝謝你的迴應。 – r109 2013-03-08 21:21:34

相關問題