Error fatal de PHP: no se puede volver a declarar la clase

162

¿Alguien sabe qué puede causar este problema?

Error fatal de PHP: no se puede volver a declarar la clase

Jin Yong
fuente
11
Esto puede agregarse con APC + carga automática ver stackoverflow.com/questions/4575341/…
gagarine
55
Use la carga automática, o también puede intentarloif(!class_exists('YourClass')){ include 'YourClass.php'; }
Timo Huovinen

Respuestas:

117

Significa que ya has creado una clase.

Por ejemplo:

class Foo {}

// some code here

class Foo {}

Ese segundo Foo arrojaría el error.

cualdan
fuente
75
Esta respuesta no es tan útil como la de AaronLS. No creo que el interrogador hubiera hecho la pregunta si hubiera escrito una repetición obvia como esta (incluso en una situación bastante compleja). La sugerencia include_once ayuda a aclarar una característica oscura de PHP.
DavidHyogo
2
Este error también puede ocurrir si define el método __construct más de una vez.
Jack Trowbridge
44
Simplemente use include_once ('FooBar.php') para incluir su clase. El nombre de la función se explica por sí mismo.
Marco Matarazzi
2
La respuesta de AaronLS tiene una calificación mucho más alta, y puedes encontrarla aquí abajo .
qris
1
En realidad, esto responde a la pregunta perfectamente y es atemporal, AaronLS asume y luego intenta resolver el problema que ahora se puede resolver de muchas maneras mejores.
TarranJones
317

Tiene una clase del mismo nombre declarada más de una vez. Tal vez a través de múltiples incluye. Al incluir otros archivos, debe usar algo como

include_once "something.php";

para prevenir inclusiones múltiples. Es muy fácil que esto suceda, aunque no siempre es obvio, ya que podría tener una larga cadena de archivos incluidos entre sí.

AaronLS
fuente
10
esto fue realmente ayuda completa!
Marci-man
44
evite include_once , es lento, use otra cosa, como carga automática :)
Timo Huovinen
21
@Timo Según los puntos de referencia que he visto, solo habrá una diferencia notable de aproximadamente 1 segundo si tiene un archivo con 100,000 include_once's. Sería mejor optimizar su acceso a la base de datos u otra lógica que la optimización prematura de su archivo incluye el uso de técnicas de calidad inferior, como los archivos de inclusión maestra. La función de carga automática no funciona de manera significativamente diferente. Cada uno funciona de manera diferente y no son intercambiables. Puede usar uno para el otro, pero hay casos de esquina donde no funcionan igual.
AaronLS
3
@Timo Para citar la página que ha vinculado "se desaconseja el uso de __autoload () y puede quedar en desuso o eliminarse en el futuro".
AaronLS
1
@AaronLS No se pueden editar comentarios en SO, el enlace también enlaza con el mejor ejemplo . Lo sugerí después de leer los comentarios de los desarrolladores de APC y cómo odiaba include_once (me sentí mal por él). Además, la diferencia va más allá del rendimiento.
Timo Huovinen
55

Eso sucede cuando declaras una clase más de una vez en una página. Puede arreglarlo envolviendo esa clase con una declaración if (como a continuación), o puede ponerlo en un archivo separado y usarlo require_once(), en lugar de include().

if (!class_exists('TestClass')) {
   // Put class TestClass here
}
Sam
fuente
55
it's class_exists ('TestClass') === false or! class_exist ('TestClass')
Jens A. Koch
2
En el comentario de @ Jens-AndréKoch falta una "s" en el segundo ejemplo -> es class_exists('TestClass') === falseo!class_exists('TestClass')
furins
Cierto. Gracias por señalar eso. Ya no es editable ... tiempo de espera.
Jens A. Koch
Gracias por esta lógica.
Frank
21

Uso include_once();: con esto, sus códigos se incluirán solo una vez.

farhad
fuente
15

Esto sucederá si usamos cualquiera de las clases integradas en la biblioteca php. Usé el nombre de la clase como Directorio y obtuve el mismo error. Si obtiene un error primero, asegúrese de que el nombre de la clase que usa no sea una de las clases integradas.

Ajeesh
fuente
Respuesta dorada aquí para mí: ¡ni siquiera pensé que PHP podría haber tenido el mismo nombre de clase que estaba usando!
Jamie M
12

Este error también puede ocurrir si define el __constructmétodo más de una vez.

yonicsurny
fuente
2
Esto debería ser un comentario sobre la respuesta ya aceptada y altamente votada
Yaroslav
8

A veces eso sucede debido a algunos errores en FastCGI de PHP.

Intenta reiniciarlo. En Ubuntu es:

service php-fastcgi restart
luchaninov
fuente
Ok, es una solución, pero no corrige el problema. Y en mi caso, el problema aparece aleatoriamente una o dos veces por mes. :(
SkaJess
@SkaJess: puede agregar el comando de reinicio a crontab para reiniciar cada hora. sucio, pero asegurará que el tiempo máximo de inactividad de su sitio será de 1 hora.
luchaninov
@how: no es una buena solución para mí porque php se está cayendo durante la jornada laboral. Creo que de alguna manera agregaré el comando de reinicio diariamente durante la noche. En la segunda forma, consideraré actualizar IIS y PHP.
SkaJess
6

Tuve el mismo problema mientras usaba lo autoloadsiguiente:

<?php

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


__autoload("MyClass1");

$obj = new MyClass1();

?>

y en otra clase hubo:

namespace testClassNamespace;


class MyClass1
{

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

La solución es mantener la compatibilidad del espacio de nombres, en mi ejemplo namespace testClassNamespace;en ambos archivos.

Jacob
fuente
3

Solo agregando;

Este error también puede ocurrir si por error coloca una función dentro de otra función.

Bretddog
fuente
3

PHP 5.3 (y creo que las versiones anteriores también) parece tener problemas con el mismo nombre en diferentes casos. Así que tuve este problema cuando tuve la clase Login y la interfaz que implementa LogIn. Después de cambiar el nombre de LogIn por Log_In, el problema se resolvió.

Juri Sinitson
fuente
3

Simplemente haga una cosa cada vez que incluya o requiera un nombre de archivo, es decir, class.login.php. Puedes incluirlo de esta manera:

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

De esta manera nunca arroja un error.

Haque astuto
fuente
2

Esta función imprimirá una pila diciéndole de dónde se llamó:

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>';
}

Llame a esta función en la parte superior del archivo que incluye su clase.

A veces solo se imprimirá una vez, aunque su clase se incluya dos o más veces. Esto se debe a que PHP en realidad analiza todas las clases de nivel superior en un archivo antes de ejecutar cualquier código y arroja el error fatal de inmediato. Para remediar esto, envuelva su declaración de clase enif(true) { ... } , lo que hará que su clase baje un nivel de alcance. Entonces debería obtener sus dos rastros antes de los errores fatales de PHP.

Esto debería ayudarlo a encontrar dónde se incluye su clase varias veces en un proyecto complejo.

mpen
fuente
1

¿Usó Zend Framework? Yo también tengo el mismo problema.
Lo resolví comentando esto en la siguiente línea config/application.ini:

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

Espero que esto ayude.

Praditha
fuente
1

Otro posible culpable es el control de la fuente y los conflictos no resueltos. SVN puede hacer que la misma clase aparezca dos veces en el archivo de código en conflicto; dos versiones alternativas de la misma ("mía" y "suya").

Konrad Morawski
fuente
1

Me he encontrado con el mismo problema: la versión más nueva de php no trata lo mismo con múltiples inclusiones del mismo archivo (como una biblioteca), por lo que ahora tengo que cambiar toda mi inclusión por alguna include_once.

O estos trucos podrían ayudar, si no tienes demasiada clase en tu biblioteca ...

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

Tuve el mismo problema "Error fatal de PHP: no se puede volver a declarar la clase XYZ.php".

Tengo dos directorios como controllery modely cargué por error XYZ.php en ambos directorios (por lo que el archivo con el mismo nombre causa el problema).

Primera solución

Busque en todo su proyecto y asegúrese de tener solo una clase XYZ.php.

Segunda solución:

Agregue un espacio de nombres en su clase para que pueda usar el mismo nombre de clase.

Muhammad Shahzad
fuente
0

Me he encontrado con ese mismo problema. descubrí que el caso era el nombre de la clase. Lo solucioné cambiando el nombre. por lo tanto resolviendo el problema.

RT
fuente
0

En realidad, significa que la clase ya está declarada en la página y está intentando recrearla.

Una técnica simple es la siguiente.

Resolví el problema con lo siguiente. Espero que esto te ayude un poco.

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