web-dev-qa-db-fra.com

PHP Erreur irrécupérable: impossible de redéclarer la classe

Est-ce que quelqu'un sait ce qui peut causer ce problème?

Erreur irrécupérable PHP: impossible de redéclare la classe

160
Jin Yong

Cela signifie que vous avez déjà créé une classe.

Par exemple:

class Foo {}

// some code here

class Foo {}

Ce deuxième Foo lancerait l'erreur.

117
whichdan

Vous avez une classe du même nom déclarée plus d'une fois. Peut-être via plusieurs inclus. Lorsque vous incluez d’autres fichiers, vous devez utiliser quelque chose comme:

include_once "something.php";

pour éviter les inclusions multiples. C’est très facile, bien que cela ne soit pas toujours évident, puisqu’une longue chaîne de fichiers peut être incluse les uns par les autres.

314
AaronLS

Cela se produit lorsque vous déclarez une classe plusieurs fois dans une page. Vous pouvez résoudre ce problème en enveloppant cette classe avec une instruction if (comme ci-dessous) ou en la plaçant dans un fichier séparé et en utilisant require_once() au lieu de include().

if (!class_exists('TestClass')) {
   // Put class TestClass here
}
55
Sam

Utilisez include_once(); - avec ceci, vos codes ne seront inclus qu’une fois.

20
farhad

Cela se produira si nous utilisons l'une des classes intégrées de la bibliothèque php. J'ai utilisé le nom de la classe comme répertoire et j'ai eu la même erreur. Si vous obtenez une erreur en premier, assurez-vous que le nom de la classe que vous utilisez ne fait pas partie des classes intégrées.

15
Ajeesh

Cette erreur peut également se produire si vous définissez la méthode __construct plusieurs fois.

12
yonicsurny

Cela se produit parfois à cause de bugs dans PHP FastCGI.

Essayez de le redémarrer. Chez Ubuntu, c'est:

service php-fastcgi restart
8
luchaninov

J'ai eu le même problème en utilisant autoload comme suit:

<?php

function __autoload($class_name)
{
    include $class_name . '.php';
}


__autoload("MyClass1");

$obj = new MyClass1();

?>

et dans une autre classe il y avait:

namespace testClassNamespace;


class MyClass1
{

    function  __construct()
    {
        echo "MyClass1 constructor";
    }
}

La solution consiste à conserver la compatibilité des espaces de noms, dans mon exemple namespace testClassNamespace; dans les deux fichiers.

6
Jacob

Il suffit d'ajouter;

Cette erreur peut également se produire si vous insérez par erreur une fonction dans une autre fonction.

3
bretddog

PHP 5.3 (une version aussi ancienne, je pense) semble avoir des problèmes avec le même nom dans différents cas. J'ai donc eu ce problème quand a eu la classe Login et l'interface implémentée LogIn. Après avoir renommé LogIn en Log_In, le problème a été résolu.

3
Juri Sinitson

Faites juste une chose à chaque fois que vous incluez ou exigez un nom de fichier, à savoir class.login.php. Vous pouvez l'inclure de cette façon:

include_once class.login.php or 
require_once class.login.php

De cette façon, il ne jette jamais une erreur.

3
Asraful Haque

Cette fonction imprimera une pile vous indiquant d'où elle a été appelée:

function PrintTrace() {
    $trace = debug_backtrace();
    echo '<pre>';
    $sb = array();
    foreach($trace as $item) {
        if(isset($item['file'])) {
            $sb[] = htmlspecialchars("$item[file]:$item[line]");
        } else {
            $sb[] = htmlspecialchars("$item[class]:$item[function]");
        }
    }
    echo implode("\n",$sb);
    echo '</pre>';
}

Appelez cette fonction en haut du fichier qui inclut votre classe.

Parfois, il n’imprimera qu’une fois, même si votre cours est inclus deux fois ou plus. En effet, PHP analyse en fait toutes les classes de niveau supérieur d'un fichier avant d'exécuter du code et renvoie immédiatement l'erreur fatale. Pour remédier à cela, placez votre déclaration de classe dans if(true) { ... }, ce qui permettra à votre classe de descendre d'un niveau. Ensuite, vous devriez obtenir vos deux traces avant les erreurs fatales PHP.

Cela devrait vous aider à trouver où votre classe est incluse à plusieurs reprises dans un projet complexe.

2
mpen

J'ai eu le même problème "Erreur PHP Fatal: Impossible de redéclarer la classe XYZ.php".

J'ai deux répertoires comme controller et model et j'ai téléchargé par erreur XYZ.php dans les deux répertoires (un fichier portant le même nom est donc à l'origine du problème).

Première solution:

Recherchez dans l'ensemble de votre projet et assurez-vous de n'avoir qu'une seule classe XYZ.php.

Deuxième solution:

Ajoutez un espace de noms dans votre classe pour pouvoir utiliser le même nom de classe.

1
Muhammad Shahzad

Avez-vous utilisé Zend Framework? J'ai le même probléme.
Je l'ai résolu en commentant la ligne suivante dans config/application.ini:

;includePaths.library = APPLICATION_PATH "/../library"

J'espère que cela t'aidera.

1
Praditha

Un autre coupable possible est le contrôle de source et les conflits non résolus. SVN peut faire en sorte que la même classe apparaisse deux fois dans le fichier de code en conflit; deux versions alternatives de celui-ci ("mine" et "leur").

1
Konrad Morawski

J'ai rencontré le même problème: la nouvelle version de php ne traite pas de la même façon avec plusieurs inclusions du même fichier (en tant que bibliothèque), donc maintenant je dois changer tous mes include par certains include_once.

Ou bien, cette astuce pourrait vous aider si vous n’avez pas trop de classe dans votre bibliothèque ...

if( class_exists('TestClass') != true )
{
   //your definition of TestClass
}
1
Alexandre Mazel

j'ai rencontré le même problème. découvert le cas était le nom de la classe. J'ai traité avec en changeant le nom. donc résoudre le problème.

0
R T

Cela signifie en fait que la classe est déjà déclarée dans la page et que vous essayez de la recréer.

Une technique simple est la suivante.

J'ai résolu le problème avec ce qui suit. J'espère que cela vous aidera un peu.

if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}
0
mohitesachin217