web-dev-qa-db-fra.com

PHP: impossible de déclarer la classe car le nom est déjà utilisé

J'ai 5 scripts, disons: database.php, parent.php, child1.php, child2.php et somescript.php

la classe parent.php ressemble à ceci:

include 'database.php';

class Parent {
    public $db;
    function __construct() {
        $this->db = new Database();
    }
}

les classes child1 et child2 ressemblent à ceci:

include 'parent.php';

class Child1 extends Parent {
    function __construct() {
        parent::__construct();
    }

    function useDb() {
        $this->db->some_db_operation();
    }
}

Le problème

Lorsque j'essaie d'inclure à la fois l'enfant1 et l'enfant2 dans le fichier somescript.php, l'erreur suivante s'affiche:

ne peut pas déclarer la classe Database parce que le nom est déjà utilisé dans database.php à la ligne 4 (cette ligne contient les mots 'classe Database')

Mais si je n'inclus qu'un seul fichier (child1 ou child2), cela fonctionne très bien.

Comment puis-je corriger cela?

27
egorik

vous voulez utiliser include_once () ou require_once () . L’autre option serait de créer un fichier supplémentaire avec tous les inclus de votre classe dans le bon ordre afin qu’ils n’aient pas besoin d’appeler eux-mêmes:

"classes.php"

include 'database.php';
include 'parent.php';
include 'child1.php';
include 'child2.php';

Alors vous avez juste besoin de:

require_once('classes.php');
28
M31

essayez d'utiliser include_onceou require_once au lieu de include ou require

8
Solaymane Chamane

Une autre option pour include_once ou require_once consiste à utiliser le chargement automatique de classe. http://php.net/manual/en/language.oop5.autoload.php

2
Fergal Andrews

J'ai eu ce problème avant et pour résoudre ce problème, assurez-vous juste:

  1. Vous n'avez pas créé d'instance de cette classe avant
  2. Si vous appelez cela à partir d'une méthode de classe, assurez-vous que __destruct est défini sur la classe à partir de laquelle vous avez appelé.

Mon problème (avant):
J'avais: Core, Router, Autorisations et Render Core inclut la classe Router, Router appelle ensuite la classe Permissions, puis Router __destruct appelle la classe Render et le message d'erreur "Impossible de déclarer la classe car son nom est déjà utilisé". apparu.

Solution :
J'ai ajouté __destruct à la classe Autorisation et le __destruct était vide et résolu ...

0
PlanetCloud