24 votes

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 child1 et child2 dans somescript.php, cela renvoie l'erreur suivante:

ne peut pas déclarer la classe Database car le nom est déjà utilisé dans database.php à la ligne 4 (c'est la ligne qui contient les mots 'class Database')

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

Comment puis-je corriger cela?

22voto

M31 Points 861

Vous voulez utiliser include_once() ou require_once(). Une autre option serait de créer un fichier supplémentaire avec toutes vos inclusions de classes dans le bon ordre afin qu'elles n'aient pas besoin d'appeler elles-mêmes les inclusions :

"classes.php"

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

Ensuite, vous avez juste besoin de :

require_once('classes.php');

7voto

Essayez d'utiliser include_once ou require_once au lieu de include ou require

2voto

Fergal Andrews Points 114

Une autre option pour inclure une seule fois ou exiger une seule fois est d'utiliser le chargement automatique des classes. http://php.net/manual/fr/language.oop5.autoload.php

0voto

PlanetCloud Points 264

J'avais déjà rencontré ce problème et pour le résoudre, Assurez-vous simplement :

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

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

Solution :
J'ai ajouté __destruct dans la classe Permission et le __destruct était vide et ça a marché...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X