web-dev-qa-db-fra.com

PHP: erreur fatale: impossible d'instancier la classe abstraite

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?

9
klor

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;
13
arbogastes

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.

3
T. AKROUT