Erreur fatale: Déclaration de .. doit être compatible avec PHP ..
J'obtiens l'erreur suivante:
Fatal error: Declaration of Shoppingcart::addToCart() must be compatible with that of Ishoppingcart::addToCart() in klassen.php on line 118
Quel pourrait être le problème? Je ne le trouve pas
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
?>
OriginalL'auteur MOTIVECODEX | 2012-06-30
Vous devez vous connecter pour publier un commentaire.
Ishoppingcart::addToCart()
stipule que la méthode ne prend aucun paramètre, tandis que la mise en œuvreShoppingcart::addToCart(Product $product)
exige qu'un paramètre de typeProduct
doit être passé dans la méthode. Cela signifie que les deux déclarations sont incompatibles et alors que la mise en œuvre de l'interface doit être convaincu PHP jette le montre l'erreur.Solution serait de changer
Ishoppingcart::addToCart()
àIshoppingcart::addToCart(Product $product)
de sorte qu'il nécessite un paramètre de typeProduct
ou de changerShoppingcart::addToCart(Product $product)
pour permettre à aucun paramètre passé à la méthode:Shoppingcart::addToCart(Product $product = null)
;La façon correcte dépend des exigences de votre application.
= null
À mon avis, à l'aide de la valeur par défaut NULL est un hack qui l'emporte sur l'objectif d'une interface. J'attends une interface d'avoir un contrat de "c'est exactement la signature de cette méthode." J'ai l'impression que l'interface doit avoir le paramètre, ou les deux méthodes doivent être nommés différemment.
Je suis exactement les instructions suivantes dans mon livre. Mais cela n'a pas fonctionné. Je vais utiliser le hack pour maintenant, parce que le changement aura un effet sur d'autres choses dans le script.
Attendez c'est à partir d'un livre? Je changerais les livres. Ce n'est pas une grosse affaire, mais pour un éditée livre, je m'attendais pas à une erreur sur l'auteur de la partie.
Je sais, le cours que je suis a un professeur qui a écrit ce livre. Si je me plains de quelque chose ne fonctionne pas, il va dire que c'est probablement quelque chose que (I) vous vous faites mal. Il ne va pas aider etc. Mais C'est encore une semaine et je me suis fait sur ce collège et aller de l'étude de la Technologie de Jeu. Je vais brûler ce livre de merde. SEULS problèmes, rien n'a fonctionné. Et le plus drôle, c'est l'enseignante qui a écrit ce livre, c'est à dire qu'on ne sont autorisés à utiliser ce livre. Va nous envoyer une réclamation à l'école après que j'ai obtenu mes papiers d'obtention du diplôme dans ma poche. Mais de toute façon, merci 🙂
OriginalL'auteur Stefan Gehrig
La déclaration d'une fonction publique dans une sous-classe doit correspondre à celle de son parent:
Vous ne pouvez pas ajouter un paramètre à la signature.
Cela est étroitement lié à la Principe de substitution de Liskov.
OriginalL'auteur Corbin
Interface Ishoppingcart semble définir addToShoppingCart sans paramètres, la classe mais Shoppingcart définit de la même fonction, à prendre des Produits en tant que paramètre. Je suppose que la méthode dans l'interface doit prendre le Produit en tant que paramètre.
OriginalL'auteur Jari