2012-06-30 14 views
13

と互換性がある必要があり、私は次のエラーを取得しています:致命的なエラー..宣言が... PHP

Fatal error: Declaration of Shoppingcart::addToCart() must be compatible with that of Ishoppingcart::addToCart() in klassen.php on line 118 

問題がある可能性がありますか?私はそれを見つけることができません スクリプト:

<?php 
// begin 
interface Ishoppingcart{ 
    public function addToCart(); 
    public function printOverzicht(); 
} 
abstract class Shoppingcart implements Ishoppingcart 
{ 
    protected $producten = array(); 

    public function addToCart(Product $product) { 
     $this->producten[] = $product; 
    } 
} 
class Myshoppingcart extends Shoppingcart { 
    public function printOverzicht(){ 
     echo ("<table border=1> 
     <tr> 
     <td colspan='7'>Bestellingoverzicht</td> 
     </tr> 
     <tr> 
     <td bgcolor=#cccccc> Product ID</td> 
     <td bgcolor=#cccccc> Beschrijving</td> 
     <td bgcolor=#cccccc> Merk</td> 
     <td bgcolor=#cccccc> Model</td> 
     <td bgcolor=#cccccc> Prijs</td> 
     <td bgcolor=#cccccc> Aantal</td> 
     <td bgcolor=#cccccc> Korting</td> 
     </tr>"); 

     foreach($this->producten as $product){ 
      $rij = ""; 
      $rij .= "<tr>"; 
      $rij .= "<td>".$product->getID()."</td>"; 
      $rij .= "<td>".$product->getBeschrijving()."</td>"; 
      $rij .= "<td>".$product->getMerk()."</td>"; 
      $rij .= "<td>".$product->getModel()."</td>"; 
      $rij .= "<td>".$product->getPrijs()."</td>"; 
      $rij .= "<td>".$product->getAantal()."</td>"; 
      $rij .= "<td>".$product->getKorting()."</td>"; 
      $rij .= "</tr>"; 
      echo ($rij); 
     } 
     echo ("</table>"); 
    } 
} 
class Product { 
    private $id; 
    private $beschrijving; 
    private $merk; 
    private $model; 
    private $prijs; 
    private $aantal; 
    private $korting; 

    function __construct($id, 
         $merk, 
         $model, 
         $prijs, 
         $aantal, 
         $korting){ 
     $this->id = $id; 
     $this->beschrijving = $beschrijving; 
     $this->merk = $merk; 
     $this->model = $model; 
     $this->prijs = $prijs; 
     $this->aantal = $aantal; 
     $this->korting = $korting; 
     echo ("<br />Nieuw Product object $beschrijving wordt aangemaakt"); 
         } 
    public function __destruct(){ 
     // voer benodigde acties uit 
     echo ("<br />Product object $this->beschrijving wordt verwijderd"); 
    } 
    // set function 
    public function setId($id){ 
     $this->id = $id; 
    } 
    public function setBeschrijving($beschrijving){ 
     $this->beschrijving = $beschrijving; 
    } 
    public function setMerk($merk){ 
     $this->merk = $merk; 
    } 
    public function setModel($model){ 
     $this->model = $model; 
    } 
    public function setPrijs($prijs){ 
     $this->prijs = $prijs; 
    } 
    public function setAantal($aantal){ 
     $this->aantal = $aantal; 
    } 
    public function setKorting($korting){ 
     $this->korting = $korting; 
    } 
    // get function 
    public function getId(){ 
     return $this->id = $id; 
    } 
    public function getBeschrijving(){ 
     return $this->beschrijving; 
    } 
    public function getMerk(){ 
     return $this->merk; 
    } 
    public function getModel(){ 
     return $this->model; 
    } 
    public function getPrijs(){ 
     return $this->prijs; 
    } 
    public function getAantal(){ 
     return $this->aantal; 
    } 
    public function getKorting(){ 
     return $this->korting; 
    } 

    // printProductInfo 
    public function printProductInfo(){ 
    $rij = "<tr><td>$this->id</td>"; 
    $rij .= "<td>$this->beschrijving</td>"; 
    $rij .= "<td>$this->merk</td>"; 
    $rij .= "<td>$this->model</td>"; 
    $rij .= "<td>$this->prijs</td>"; 
    $rij .= "<td>$this->aantal</td>"; 
    $rij .= "<td>$this->korting</td>"; 
    echo ($rij); 
    } 
} 
// einde 
?> 

答えて

20

Ishoppingcart::addToCart()は、実装Shoppingcart::addToCart(Product $product)がタイプProductのパラメータがメソッドに渡さなければならないことを要求しながら、この方法は、任意のパラメータを取らないと述べています。これは、両方の宣言が互換性がなく、実装されたインタフェースが満足されなければならない間に、PHPが示されたエラーをスローすることを意味します。

ソリューションのいずれかとすることがタイプProductのパラメータを必要とするか、メソッドに渡されないパラメータ許可しないようにShoppingcart::addToCart(Product $product)を変更するようにIshoppingcart::addToCart(Product $product)Ishoppingcart::addToCart()を変更するであろう:Shoppingcart::addToCart(Product $product = null)と、

正しい方法は、アプリケーションの要件によって異なります。

+0

を働いた、私は私の意見ではF4LLCON @ '= null'なので – MOTIVECODEX

+10

を使用しますありがとう、NULLのデフォルト値を使用するハックですインタフェースの目的を破るものです。私は、インタフェースが "これは*正確に*このメソッドの署名です"という契約を持つことを期待しています。インターフェイスがパラメータを持つ必要がありますか、または2つのメソッドの名前を異なるようにする必要があります。 – Corbin

+0

私は私の本の指示にちょうど従っています。しかし、それは動作しませんでした。何かを変えることはスクリプトの中の他のものに影響を与えるので、私は今ハックを使用します。 – MOTIVECODEX

4

サブクラスのパブリック関数の宣言は、その親のものと一致する必要があります。

public function addToCart(); 
public function addToCart(Product $product) 

あなたが署名にパラメータを追加することはできません。

これはLiskov substitution principleと密接に関連しています。

+0

ありがとう、ステファン・ゲーリックソリューションは – MOTIVECODEX

2

インターフェイスIshoppingcartはパラメータなしでaddToShoppingCartを定義しているようですが、クラスShoppingcartはProductと同じ関数をパラメータとして定義しています。私は、インターフェイスのメソッドは同様にパラメータとして製品を取る必要がありますと思います。

+0

ありがとう働いた、ステファン・ゲーリックソリューションは、どちらの方法が働く – MOTIVECODEX

関連する問題