Erreur fatale PHP: impossible de redéclarer la classe

162

Quelqu'un sait-il ce qui peut causer ce problème?

Erreur fatale PHP: impossible de redéclarer la classe

Jin Yong
la source
11
Cela peut s'ajouter avec APC + autload voir stackoverflow.com/questions/4575341/…
gagarine
5
Utilisez le chargement automatique, ou vous pouvez également essayerif(!class_exists('YourClass')){ include 'YourClass.php'; }
Timo Huovinen

Réponses:

117

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

Par exemple:

class Foo {}

// some code here

class Foo {}

Ce deuxième Foo lèverait l'erreur.

whichdan
la source
75
Cette réponse n'est pas aussi utile que celle d'AaronLS. Je ne pense pas que l'interlocuteur aurait posé la question s'il avait écrit une répétition évidente comme celle-ci (même dans une situation assez complexe). L'astuce include_once permet de clarifier une fonctionnalité obscure de PHP.
DavidHyogo
2
Cette erreur peut également se produire si vous définissez la méthode __construct plusieurs fois.
Jack Trowbridge
4
Utilisez simplement include_once ('FooBar.php') pour inclure votre classe. Le nom de la fonction est explicite.
Marco Matarazzi
2
La réponse d'AaronLS est bien mieux notée, et vous pouvez la trouver ici .
qris
1
En fait, cela répond parfaitement à la question et il est intemporel, AaronLS fait une hypothèse puis tente de résoudre le problème qui peut maintenant être résolu de nombreuses meilleures façons.
TarranJones
317

Vous avez une classe du même nom déclarée plus d'une fois. Peut-être via plusieurs comprend. 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, mais pas toujours évident, car vous pourriez avoir une longue chaîne de fichiers inclus les uns par les autres.

AaronLS
la source
10
c'était vraiment une aide complète!
Marci-man
4
évitez include_once , c'est lent, utilisez autre chose à la place, comme le chargement automatique :)
Timo Huovinen
21
@Timo Sur la base des benchmarks que j'ai examinés, il n'y aura une différence notable d'environ 1 seconde que si vous avez un fichier avec 100 000 include_once. Vous feriez mieux d'optimiser votre accès à la base de données ou toute autre logique que d'optimiser prématurément votre fichier en utilisant des techniques de qualité inférieure telles que les fichiers d'inclusion principaux. La fonction de chargement automatique ne fonctionne pas de manière très différente. Chacun fonctionne différemment et ne sont pas interchangeables. Vous pouvez utiliser l'un pour l'autre, mais il existe des cas d'angle où ils ne fonctionnent pas de la même manière.
AaronLS
3
@Timo Pour citer la page que vous avez liée, "l'utilisation de __autoload () est déconseillée et peut être obsolète ou supprimée à l'avenir."
AaronLS
1
@AaronLS Impossible de modifier les commentaires sur SO, le lien renvoie également au meilleur exemple . Je l'ai suggéré après avoir lu les commentaires des développeurs d'APC et comment il détestait include_once (je me sentais mal pour lui). La différence va également au-delà des performances.
Timo Huovinen
55

Cela se produit lorsque vous déclarez une classe plus d'une fois dans une page. Vous pouvez le corriger en enveloppant cette classe avec une instruction if (comme ci-dessous), ou vous pouvez la placer dans un fichier séparé et utiliser require_once(), au lieu de include().

if (!class_exists('TestClass')) {
   // Put class TestClass here
}
Sam
la source
5
c'est class_exists ('TestClass') === false ou! class_exist ('TestClass')
Jens A. Koch
2
Dans le commentaire @ Jens-AndréKoch, il manque un "s" dans le deuxième exemple -> c'est class_exists('TestClass') === falseou!class_exists('TestClass')
furins
Vrai. Merci d'avoir fait remarquer cela. Plus modifiable .. timeout.
Jens A. Koch
Merci pour cette logique.
Frank
21

Utilisation include_once();- avec cela, vos codes ne seront inclus qu'une seule fois.

farhad
la source
15

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, assurez-vous d'abord que le nom de classe que vous utilisez ne fait pas partie des classes intégrées.

Ajeesh
la source
Réponse en or ici pour moi - je ne pensais même pas que PHP aurait pu avoir le même nom de classe que celui que j'utilisais!
Jamie M
12

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

yonicsurny
la source
2
Cela devrait être un commentaire sur la réponse déjà acceptée et hautement votée
Yaroslav
8

Cela arrive parfois à cause de quelques bogues dans FastCGI de PHP.

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

service php-fastcgi restart
Luchaninov
la source
Ok, c'est une solution mais ça ne corrige pas le problème Et dans mon cas, le problème apparaît au hasard une ou deux fois par mois. :(
SkaJess
@SkaJess - vous pouvez ajouter une commande de redémarrage à crontab pour redémarrer toutes les heures. sale - mais assurera que le temps d'arrêt maximum de votre site sera d'une heure.
luchaninov
@how - ce n'est pas une bonne solution pour moi car php tombe en panne pendant la journée de travail. Je pense que d'une manière que je vais ajouter la commande de redémarrage tous les jours pendant la nuit. Dans un second temps, j'envisagerai de mettre à jour IIS et PHP.
SkaJess
6

J'ai eu le même problème en utilisant autoloadcomme 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 est de garder la compatibilité des espaces de noms, dans mon exemple namespace testClassNamespace;dans les deux fichiers.

Jacob
la source
3

Juste ajouter;

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

chien de race
la source
3

PHP 5.3 (une version plus ancienne je pense aussi) semble avoir un problème 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 qu'elle implémente LogIn. Après avoir renommé LogIn en Log_In, le problème a été résolu.

Juri Sinitson
la source
3

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 génère jamais d'erreur.

Asraful Haque
la source
2

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 ne s'imprimera qu'une seule fois, même si votre classe est incluse deux fois ou plus. C'est parce que PHP analyse en fait toutes les classes de niveau supérieur dans un fichier avant d'exécuter du code et lève immédiatement l'erreur fatale. Pour remédier à cela, enveloppez votre déclaration de classe if(true) { ... }, ce qui fera descendre votre classe d'un niveau de portée. 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.

mpen
la source
1

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

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

J'espère que cela t'aidera.

Praditha
la source
1

Un autre coupable possible est le contrôle de la source et les conflits non résolus. SVN peut faire apparaître la même classe deux fois dans le fichier de code en conflit; deux versions alternatives de celui-ci («la mienne» et «la leur»).

Konrad Morawski
la source
1

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

Ou cette astuce pourrait vous aider, si vous n'avez pas trop de cours dans votre bibliothèque ...

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

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

J'ai deux répertoires comme controlleret modelet j'ai téléchargé par erreur XYZ.php dans les deux répertoires (donc un fichier avec le même nom cause le problème).

Première solution:

Trouvez dans l'ensemble de votre projet et assurez-vous que vous n'avez 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.

Muhammad Shahzad
la source
0

j'ai rencontré le même problème. découvert que le cas était le nom de la classe. je l'ai traité en changeant le nom. résolvant ainsi le problème.

RT
la source
0

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");
}
mohitesachin217
la source