J'ai une classe de base de données abstraite nommée comme:
abstract class database {
protected $value;
}
J'ai créé une autre classe abstraite
abstract class my_database extends database {
public function set_value($value) {
$this->value = $value;
}
}
Quand j'essaye de l'utiliser:
$my_db = new my_database();
Je reçois une erreur:
Fatal error: Cannot instantiate abstract class my_database in ...
Ce que j'essaie de faire est: la base de données de classe abstraite a une valeur $ protégée et je voudrais créer une classe wrapper, pour pouvoir changer la valeur protégée (temporairement).
Comment puis je faire ça?
EDIT1: malheureusement plus tôt, lorsque j'ai essayé sans résumé my_database, j'ai eu les erreurs:
- abstract methods and must therefore be declared abstract or implemented
- Abstract function cannot contain body
EDIT2: Après avoir retiré complètement le mot abstrait de ma_database, j'ai eu l'erreur suivante:
Erreur fatale: la classe my_database contient 32 méthodes abstraites et doit donc être déclarée abstraite ou implémenter les méthodes restantes
Comment puis-je réparer cela?
Les classes définies comme abstraites ne peuvent pas être instanciées, et toute classe qui contient au moins une méthode abstraite doit également être abstraite. Vous pouvez lire à ce sujet dans la documentation de PHP ici: lien
Voici un exemple.
Il y a une classe abstraite ( notez que les méthodes abstraites n'ont pas de corps - elles NE PEUVENT PAS avoir de corps - c'est juste une signature ):
abstract class AbstractClass
{
// Force Extending class to define this method
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// Common method. It will be available for all children - they don't have to declare it again.
public function printOut() {
print $this->getValue() . "\n";
}
}
Étendez votre classe abstraite avec une classe comme celle-ci ( notez que toutes les méthodes abstraites DOIVENT être définies dans une classe concrète ):
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
Ensuite, vous pouvez créer une instance de ConcreteClass1:
$class1 = new ConcreteClass1;
Votre classe ne doit pas être abstraite:
class my_database extends database {
public function set_value($value) {
$this->value = $value;
}
}
En POO, la classe abstraite ne peut pas être instanciée juste elle peut être étendue.