Неустранимая ошибка: Декларация.. должна быть совместима с.. PHP
Я получаю следующую ошибку:
Fatal error: Declaration of Shoppingcart::addToCart() must be compatible with that of Ishoppingcart::addToCart() in klassen.php on line 118
В чем может быть проблема? Я не могу найти его
script:
<?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
?>
Ответы
Ответ 1
Ishoppingcart::addToCart()
заявляет, что метод не принимает никакого параметра, тогда как реализация Shoppingcart::addToCart(Product $product)
требует, чтобы в метод был передан параметр типа Product
. Это означает, что обе декларации несовместимы, и, хотя реализованный интерфейс должен быть удовлетворен, PHP выдает указанную ошибку.
Решение состоит в том, чтобы либо изменить Ishoppingcart::addToCart()
на Ishoppingcart::addToCart(Product $product)
, чтобы он потребовал параметр типа Product
, либо изменить Shoppingcart::addToCart(Product $product)
, чтобы не пропускать параметр в метод: Shoppingcart::addToCart(Product $product = null)
;
Правильный способ зависит от ваших требований приложения.
Ответ 2
Объявление публичной функции в подклассе должно соответствовать объявлению его родителя:
public function addToCart();
public function addToCart( Product $product)
Вы не можете добавить параметр в подпись.
Это тесно связано с принцип подписи Лискова.
Ответ 3
Интерфейс Ishoppingcart, по-видимому, определяет addToShoppingCart без параметров, но класс Shoppingcart определяет ту же функцию, что и Продукт в качестве параметра. Я полагаю, что метод в интерфейсе также должен принимать Продукт как параметр.