2012-06-30 50 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会抛出显示的错误。

溶液。将要么改变Ishoppingcart::addToCart()Ishoppingcart::addToCart(Product $product)以便它需要Product类型的参数或改变Shoppingcart::addToCart(Product $product)以允许没有参数传递到方法:Shoppingcart::addToCart(Product $product = null);

正确的方法取决于您的应用需求。

+0

两种方式都行,谢谢我会用'= null' – MOTIVECODEX

+10

@ F4LLCON在我看来,使用默认值NULL是一种破解这打破了界面的目的。我期望一个接口有一个“这就是*这个方法的签名”的合约。“我觉得要么接口应该有参数,要么两个方法的命名应该不同。 – Corbin

+0

我完全按照我书中的说明操作。但它没有奏效。我现在将使用黑客技术,因为更改某些内容会影响脚本中的其他内容。 – MOTIVECODEX

4

在子类中的公共功能必须与其父的声明:

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

您不能将参数添加到签名。

这与Liskov substitution principle密切相关。

+0

谢谢Stefan Gehrig的解决方案出来了 – MOTIVECODEX

2

接口Ishoppingcart似乎没有参数定义addToShoppingCart,但类Shoppingcart定义了以Product作为参数的相同函数。我想接口中的方法也应该将Product作为参数。

+0

谢谢Stefan Gehrig的解决方案制定出 – MOTIVECODEX