Errore irreversibile PHP: impossibile ripetere la dichiarazione di classe


Risposte:


117

Significa che hai già creato una classe.

Per esempio:

class Foo {}

// some code here

class Foo {}

Quel secondo Foo avrebbe gettato l'errore.


75
Questa risposta non è utile come quella di AaronLS. Non credo che l'interrogante avrebbe posto la domanda se avesse scritto una ovvia ripetizione come questa (anche in una situazione abbastanza complessa). Il suggerimento include_once aiuta a chiarire una caratteristica oscura di PHP.
DavidHyogo,

2
Questo errore può verificarsi anche se si definisce il metodo __construct più di una volta.
Jack Trowbridge,

4
Usa include_once ('FooBar.php') per includere la tua classe. Il nome della funzione è autoesplicativo.
Marco Matarazzi,

2
La risposta di AaronLS è molto più votata e puoi trovarla qui .
Qris,

1
In realtà questo risponde perfettamente alla domanda ed è senza tempo, AaronLS fa un'ipotesi quindi tenta di risolvere il problema che ora può essere risolto in molti modi migliori.
Tarran Jones,

317

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.


10
questo è stato di grande aiuto!
Marci-man,

4
evitare include_once , è lento, usa invece qualcos'altro, come il caricamento automatico :)
Timo Huovinen,

21
@Timo Sulla base dei benchmark che ho visto, ci sarà una notevole differenza di circa 1 secondo se hai un file con 100.000 include_once. Faresti meglio a ottimizzare l'accesso al tuo DB o altra logica piuttosto che a ottimizzare prematuramente i tuoi file include utilizzando tecniche scadenti come i file include master. La funzione di caricamento automatico non funziona in modo significativamente diverso. Ciascuno funziona in modo diverso e non è intercambiabile in modo appropriato. Puoi usarne uno per l'altro, ma ci sono casi angolari in cui non funzionano allo stesso modo.
AaronS

3
@Timo Per citare la pagina che hai collegato "l'utilizzo di __autoload () è sconsigliato e potrebbe essere deprecato o rimosso in futuro."
AaronS

1
@AaronLS Impossibile modificare i commenti su SO, il collegamento rimanda anche all'esempio migliore . L'ho suggerito dopo aver letto i commenti degli sviluppatori di APC e come odiasse include_once (mi sono sentito male per lui). Anche la differenza va oltre la semplice performance.
Timo Huovinen,

55

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
}

5
è class_exists ('TestClass') === false o! class_exist ('TestClass')
Jens A. Koch,

2
Nel commento di @ Jens-AndréKoch manca una "s" nel secondo esempio -> è class_exists('TestClass') === falseo!class_exists('TestClass')
furins

Vero. Grazie per la segnalazione. Non modificabile più .. timeout.
Jens A. Koch,

Grazie per questa logica.
Frank,

21

Usa include_once();- con questo, i tuoi codici saranno inclusi solo una volta.


15

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.


Risposta d'oro qui per me - Non pensavo nemmeno che PHP avrebbe potuto avere lo stesso nome di classe che stavo usando!
Jamie M,

12

Questo errore può verificarsi anche se si definisce il __constructmetodo più di una volta.


2
Questo dovrebbe essere un commento sulla risposta già accettata e altamente votata
Yaroslav,

8

A volte ciò accade a causa di alcuni bug nel FastCGI di PHP.

Prova a riavviarlo. In Ubuntu è:

service php-fastcgi restart

Ok, è una soluzione ma non risolve il problema E nel mio caso, il problema appare casualmente una o due volte al mese. :(
SkaJess il

@SkaJess: è possibile aggiungere il comando restart a crontab per riavviare ogni ora. sporco - ma assicurerà che il tempo di inattività massimo del tuo sito sarà di 1 ora.
luchaninov,

@how - non è una buona soluzione per me perché php sta cadendo durante la giornata lavorativa. Penso che in un modo aggiungerò il comando restart ogni giorno durante la notte. Nel secondo modo, prenderò in considerazione l'aggiornamento di IIS e PHP.
SkaJess,

6

Ho avuto lo stesso problema durante l'utilizzo autoloadcome 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.


3

Sto solo aggiungendo;

Questo errore può verificarsi anche se si inserisce per errore una funzione all'interno di un'altra funzione.


3

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.


3

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.


2

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.


1

Hai usato Zend Framework? Anch'io ho lo stesso problema.
L'ho risolto commentando la seguente riga in config/application.ini:

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

Spero che questo ti possa aiutare.


1

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").


1

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
}

1

Ho avuto lo stesso problema "Errore irreversibile PHP: impossibile ripetere la dichiarazione XYZ.php".

Ho due directory come controllere modeled ho caricato dalla erroneamente XYZ.php in entrambe le directory. (In modo da file con lo stesso nome causa il problema).

Prima soluzione:

Trova in tutto il tuo progetto e assicurati di avere una sola classe XYZ.php.

Seconda soluzione:

Aggiungi uno spazio dei nomi nella tua classe in modo da poter usare lo stesso nome di classe.


0

ho riscontrato lo stesso problema. scoperto che il caso era il nome della classe. l'ho risolto cambiando il nome. quindi risolvendo il problema.


0

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");
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.