Я получаю следующую ошибку:
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 ?>
Ishoppingcart::addToCart()
указывает, что метод не принимает никакого параметра, тогда как для реализации Shoppingcart::addToCart(Product $product)
требуется, чтобы в метод был передан параметр типа Product
. Это означает, что обе декларации несовместимы, и, хотя реализованный интерфейс должен быть удовлетворен, PHP выдает указанную ошибку.
Решение заключалось бы в том, чтобы либо изменить Ishoppingcart::addToCart()
на Ishoppingcart::addToCart(Product $product)
чтобы он требовал параметра типа Product
либо для изменения Shoppingcart::addToCart(Product $product)
чтобы не пропускать параметр метод: Shoppingcart::addToCart(Product $product = null)
;
Правильный способ зависит от ваших требований приложения.
Объявление публичной функции в подклассе должно соответствовать объявлению его родителя:
public function addToCart(); public function addToCart( Product $product)
Вы не можете добавить параметр в подпись.
Это тесно связано с принципом замещения Лискова .
Интерфейс Ishoppingcart, по-видимому, определяет addToShoppingCart без параметров, но класс Shoppingcart определяет ту же функцию, что и Продукт в качестве параметра. Я полагаю, что метод в интерфейсе также должен воспринимать Продукт как параметр.