¿Alguien sabe qué puede causar este problema?
Error fatal de PHP: no se puede volver a declarar la clase
if(!class_exists('YourClass')){ include 'YourClass.php'; }
¿Alguien sabe qué puede causar este problema?
Error fatal de PHP: no se puede volver a declarar la clase
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Respuestas:
Significa que ya has creado una clase.
Por ejemplo:
class Foo {}
// some code here
class Foo {}
Ese segundo Foo arrojaría el error.
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í.
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
}
class_exists('TestClass') === false
o!class_exists('TestClass')
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.
Este error también puede ocurrir si define el __construct
método más de una vez.
A veces eso sucede debido a algunos errores en FastCGI de PHP.
Intenta reiniciarlo. En Ubuntu es:
service php-fastcgi restart
Tuve el mismo problema mientras usaba lo autoload
siguiente:
<?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.
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ó.
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.
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.
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").
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
}
Tuve el mismo problema "Error fatal de PHP: no se puede volver a declarar la clase XYZ.php".
Tengo dos directorios como controller
y model
y cargué por error XYZ.php en ambos directorios (por lo que el archivo con el mismo nombre causa el problema).
Busque en todo su proyecto y asegúrese de tener solo una clase XYZ.php.
Agregue un espacio de nombres en su clase para que pueda usar el mismo nombre de clase.
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");
}