Неустранимая ошибка: объявление .. должно быть совместимо с .. 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
?>

person MOTIVECODEX    schedule 30.06.2012    source источник
comment
В какой именно версии PHP возникает эта ошибка. в PHP7.2 он предупреждал о фатальной ошибке в php7.4.   -  person Praveen D    schedule 08.06.2020


Ответы (4)


Ishoppingcart::addToCart() указывает, что метод не принимает никаких параметров, в то время как реализация Shoppingcart::addToCart(Product $product) требует, чтобы в метод был передан параметр типа Product. Это означает, что оба объявления несовместимы, и хотя реализованный интерфейс должен быть удовлетворен, PHP выдает показанную ошибку.

Решением было бы либо изменить Ishoppingcart::addToCart() на Ishoppingcart::addToCart(Product $product), чтобы он требовал параметра типа Product, либо изменить Shoppingcart::addToCart(Product $product), чтобы параметр не передавался в метод: Shoppingcart::addToCart(Product $product = null);

Правильный способ зависит от требований вашего приложения.

person Stefan Gehrig    schedule 30.06.2012
comment
@ F4LLCON На мой взгляд, использование значения по умолчанию NULL - это хитрость, которая сводит на нет цель интерфейса. Я ожидаю, что у интерфейса есть контракт, что это в точности подпись этого метода. Я считаю, что либо у интерфейса должен быть параметр, либо у двух методов должны быть разные имена. - person Corbin; 30.06.2012
comment
Я точно следую инструкциям в своей книге. Но не вышло. Сейчас я воспользуюсь хаком, потому что изменение чего-то повлияет на другие вещи в скрипте. - person MOTIVECODEX; 30.06.2012
comment
@ F4LLCON Подожди, это из книги? Я бы поменял книги. Само по себе это не имеет большого значения, но для отредактированной, опубликованной книги я бы не ожидал такой ошибки со стороны автора. - person Corbin; 30.06.2012
comment
Я знаю, что у моего курса есть учитель, который написал эту книгу. Если я жалуюсь на то, что что-то не работает, он скажет, что, вероятно, вы (я) делаете что-то не так. Он не поможет и т. Д. Но осталась еще одна неделя, я закончил колледж и пойду изучать игровые технологии. Я сожгу эту дрянную книгу. ТОЛЬКО проблемы, ничего не работало. И что самое забавное, учитель, написавший эту книгу, говорит, что эту книгу разрешено использовать только нам. Собираюсь отправить жалобу в школу после того, как получу выпускные документы в кармане. Но в любом случае спасибо :) - person MOTIVECODEX; 30.06.2012
comment
Теперь, когда вы закончили курс, возможно, вы хотите поделиться книгой, которая использовалась как часть учебной программы, а может, и колледжа тоже? :) - person Chris Burgess; 12.04.2014

Объявление публичной функции в подклассе должно совпадать с объявлением ее родителя:

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

Вы не можете добавить параметр в подпись.

Это тесно связано с принципом подстановки Лискова.

person Corbin    schedule 30.06.2012

Интерфейс Ishoppingcart, кажется, определяет addToShoppingCart без параметров, но класс Shoppingcart определяет ту же функцию, принимая Product в качестве параметра. Я полагаю, что метод в интерфейсе также должен принимать Product в качестве параметра.

person Jari    schedule 30.06.2012

Я решил эту проблему, обновившись до последней версии php.

person Ansyori    schedule 27.05.2020