Qualcuno sa cosa può causare questo problema?
Errore irreversibile PHP: impossibile ripetere la dichiarazione di classe
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Qualcuno sa cosa può causare questo problema?
Errore irreversibile PHP: impossibile ripetere la dichiarazione di classe
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Risposte:
Significa che hai già creato una classe.
Per esempio:
class Foo {}
// some code here
class Foo {}
Quel secondo Foo avrebbe gettato l'errore.
Hai una classe con lo stesso nome dichiarata più di una volta. Forse tramite più include. Quando si includono altri file è necessario utilizzare qualcosa di simile
include_once "something.php";
per evitare inclusioni multiple. È molto facile che ciò accada, anche se non sempre ovvio, dal momento che potresti avere una lunga catena di file inclusi l'uno nell'altro.
Ciò accade quando si dichiara una classe più di una volta in una pagina. Puoi risolverlo avvolgendo quella classe con un'istruzione if (come sotto), oppure puoi metterlo in un file separato e usarlo require_once()
, invece di include()
.
if (!class_exists('TestClass')) {
// Put class TestClass here
}
class_exists('TestClass') === false
o!class_exists('TestClass')
Questo accadrà se usiamo una qualsiasi delle classi integrate nella libreria php. Ho usato il nome della classe come Directory e ho avuto lo stesso errore. Se si verifica un errore, assicurarsi innanzitutto che il nome della classe utilizzato non sia una delle classi integrate.
Questo errore può verificarsi anche se si definisce il __construct
metodo più di una volta.
A volte ciò accade a causa di alcuni bug nel FastCGI di PHP.
Prova a riavviarlo. In Ubuntu è:
service php-fastcgi restart
Ho avuto lo stesso problema durante l'utilizzo autoload
come segue:
<?php
function __autoload($class_name)
{
include $class_name . '.php';
}
__autoload("MyClass1");
$obj = new MyClass1();
?>
e in altre classi c'erano:
namespace testClassNamespace;
class MyClass1
{
function __construct()
{
echo "MyClass1 constructor";
}
}
Il sollution è di mantenere la compatibilità dello spazio dei nomi, nel mio esempio namespace testClassNamespace;
in entrambi i file.
PHP 5.3 (penso anche alle versioni precedenti) sembra avere problemi con lo stesso nome in diversi casi. Quindi ho avuto questo problema quando avevo la classe Login e l'interfaccia che implementava LogIn. Dopo aver rinominato LogIn in Log_In, il problema è stato risolto.
Fai solo una cosa ogni volta che includi o richiedi un nome file, ovvero class.login.php. Puoi includerlo in questo modo:
include_once class.login.php or
require_once class.login.php
In questo modo non genera mai un errore.
Questa funzione stamperà una pila che ti dice da dove è stata chiamata:
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>';
}
Chiama questa funzione nella parte superiore del file che include la tua classe.
A volte verrà stampato solo una volta, anche se la tua classe viene inclusa due o più volte. Questo perché PHP analizza effettivamente tutte le classi di livello superiore in un file prima di eseguire qualsiasi codice e genera immediatamente l'errore fatale. Per porre rimedio a questo, avvolgi la tua dichiarazione di classeif(true) { ... }
, che sposterà la tua classe di un livello inferiore. Quindi dovresti ottenere le tue due tracce prima degli errori fatali di PHP.
Questo dovrebbe aiutarti a trovare dove la tua classe viene inclusa più volte in un progetto complesso.
Un altro possibile colpevole è il controllo del codice sorgente e conflitti irrisolti. SVN può far apparire due volte la stessa classe nel file di codice in conflitto; due versioni alternative di esso ("mio" e "loro").
Ho riscontrato lo stesso problema: la versione php più recente non ha lo stesso effetto con più incluse dello stesso file (come una libreria), quindi ora devo modificare tutte le mie inclusioni con alcune include_once.
O questi trucchi potrebbero essere d'aiuto, se non hai troppa classe nella tua biblioteca ...
if( class_exists('TestClass') != true )
{
//your definition of TestClass
}
Ho avuto lo stesso problema "Errore irreversibile PHP: impossibile ripetere la dichiarazione XYZ.php".
Ho due directory come controller
e model
ed ho caricato dalla erroneamente XYZ.php in entrambe le directory. (In modo da file con lo stesso nome causa il problema).
Trova in tutto il tuo progetto e assicurati di avere una sola classe XYZ.php.
Aggiungi uno spazio dei nomi nella tua classe in modo da poter usare lo stesso nome di classe.
In realtà significa che la classe è già dichiarata nella pagina e si sta tentando di ricrearla.
Una tecnica semplice è la seguente.
Ho risolto il problema con quanto segue. Spero che questo ti aiuti un po '.
if(!class_exists("testClassIfExist"))
{
require_once("testClassIfExist.php");
}