Quelqu'un sait-il ce qui peut causer ce problème?
Erreur fatale PHP: impossible de redéclarer la classe
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Quelqu'un sait-il ce qui peut causer ce problème?
Erreur fatale PHP: impossible de redéclarer la classe
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Réponses:
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.
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.
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
}
class_exists('TestClass') === false
ou!class_exists('TestClass')
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.
Cette erreur peut également se produire si vous définissez la __construct
méthode plusieurs fois.
Cela arrive parfois à cause de quelques bogues dans FastCGI de PHP.
Essayez de le redémarrer. Chez Ubuntu, c'est:
service php-fastcgi restart
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 est de garder la compatibilité des espaces de noms, dans mon exemple namespace testClassNamespace;
dans les deux fichiers.
Juste ajouter;
Cette erreur peut également se produire si vous placez par erreur une fonction dans une autre fonction.
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.
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.
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.
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»).
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
}
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 controller
et model
et 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).
Trouvez dans l'ensemble de votre projet et assurez-vous que vous n'avez qu'une seule classe XYZ.php.
Ajoutez un espace de noms dans votre classe pour pouvoir utiliser le même nom de classe.
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");
}