致命错误:声明..必须与.. PHP兼容

MOT*_*DEX 19 php fatal-error

我收到以下错误:

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

可能是什么问题呢?我找不到脚本:

<?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
?>
Run Code Online (Sandbox Code Playgroud)

Ste*_*rig 27

Ishoppingcart::addToCart()声明该方法不接受任何参数,而实现Shoppingcart::addToCart(Product $product)要求Product必须将类型的参数传递给方法.这意味着两个声明都不兼容,并且必须满足实现的接口,PHP会抛出显示的错误.

解决方案将是要么改变Ishoppingcart::addToCart()Ishoppingcart::addToCart(Product $product)使得它需要类型的参数Product,或者改变Shoppingcart::addToCart(Product $product),以允许没有参数传递到方法:Shoppingcart::addToCart(Product $product = null);

正确的方法取决于您的应用要求.

  • @ F4LLCON在我看来,使用NULL的默认值是一个破坏接口目的的hack.我希望一个接口有一个"这*正好*这个方法的签名"的契约.我觉得接口应该有参数,或者两个方法应该以不同的方式命名. (10认同)
  • @ F4LLCON等等,那是一本书吗?我会换书的。它本身并不是什么大不了的事,但是对于一本编辑出版的书来说,我不希望作者有这样的错误。 (2认同)

Cor*_*bin 5

子类中公共函数的声明必须与其父类的声明匹配:

public function addToCart();
public function addToCart( Product $product)
Run Code Online (Sandbox Code Playgroud)

您无法在签名中添加参数.

这与Liskov替代原则密切相关.


eca*_*rol 5

不适用于此特定问题,但如果有人遇到此问题,请确保包含返回值(如果接口指定)。

具有如下功能的接口:

abstract public function crawled(Something $some): void;
Run Code Online (Sandbox Code Playgroud)

需要实现为:

public function crawled(Something $some): void {
}
Run Code Online (Sandbox Code Playgroud)

就我而言,我缺少: void返回类型。