Schwerwiegender PHP-Fehler: Klasse kann nicht neu deklariert werden

162

Weiß jemand, was dieses Problem verursachen kann?

Schwerwiegender PHP-Fehler: Klasse kann nicht neu deklariert werden

Jin Yong
quelle
11
Dies kann mit APC + Autload angehängt werden, siehe stackoverflow.com/questions/4575341/…
gagarine
5
Verwenden Sie Autoload, oder versuchen Sie es auchif(!class_exists('YourClass')){ include 'YourClass.php'; }
Timo Huovinen

Antworten:

117

Dies bedeutet, dass Sie bereits eine Klasse erstellt haben.

Zum Beispiel:

class Foo {}

// some code here

class Foo {}

Dieser zweite Foo würde den Fehler auslösen.

whichdan
quelle
75
Diese Antwort ist nicht so hilfreich wie die von AaronLS. Ich glaube nicht, dass der Fragesteller die Frage gestellt hätte, wenn er eine offensichtliche Wiederholung wie diese geschrieben hätte (selbst in einer recht komplexen Situation). Der include_once-Tipp hilft dabei, eine dunkle Funktion von PHP zu verdeutlichen.
DavidHyogo
2
Dieser Fehler kann auch auftreten, wenn Sie die __construct-Methode mehrmals definieren.
Jack Trowbridge
4
Verwenden Sie einfach include_once ('FooBar.php'), um Ihre Klasse einzuschließen. Der Name der Funktion ist selbsterklärend.
Marco Matarazzi
2
Die Antwort von AaronLS ist viel höher bewertet, und Sie finden sie hier unten .
Qris
1
Tatsächlich beantwortet dies die Frage perfekt und es ist zeitlos. AaronLS geht davon aus, dass er versucht, das Problem zu lösen, das jetzt auf viele bessere Arten gelöst werden kann.
TarranJones
317

Sie haben eine gleichnamige Klasse mehr als einmal deklariert. Möglicherweise über mehrere Includes. Wenn Sie andere Dateien einschließen, müssen Sie so etwas wie verwenden

include_once "something.php";

um mehrfache Einschlüsse zu verhindern. Dies ist sehr einfach, wenn auch nicht immer offensichtlich, da möglicherweise eine lange Kette von Dateien ineinander eingeschlossen ist.

AaronLS
quelle
10
das war wirklich hilfe voll!
Marci-Mann
4
Vermeiden Sie include_once , es ist langsam, verwenden Sie stattdessen etwas anderes, wie Autoloading :)
Timo Huovinen
21
@Timo Basierend auf den Benchmarks, die ich mir angesehen habe, wird es nur dann einen merklichen Unterschied von etwa 1 Sekunde geben, wenn Sie eine Datei mit 100.000 include_once haben. Sie sollten Ihren DB-Zugriff oder eine andere Logik besser optimieren, als Ihre Datei-Includes vorzeitig zu optimieren, indem Sie minderwertige Techniken wie Master-Include-Dateien verwenden. Die Autoload-Funktion funktioniert nicht wesentlich anders. Jedes funktioniert anders und ist nicht austauschbar. Sie können eins für das andere verwenden, aber es gibt Eckfälle, in denen sie nicht gleich funktionieren.
AaronLS
3
@Timo Um die Seite zu zitieren, die Sie verlinkt haben, wird die Verwendung von __autoload () nicht empfohlen und möglicherweise in Zukunft veraltet oder entfernt.
AaronLS
1
@AaronLS Kommentare zu SO können nicht bearbeitet werden, der Link verweist auch auf das bessere Beispiel . Ich schlug es vor, nachdem ich die Kommentare der APC-Entwickler gelesen hatte und wie er include_once hasste (ich fühlte mich schlecht für ihn). Auch der Unterschied geht über die reine Leistung hinaus.
Timo Huovinen
55

Dies geschieht, wenn Sie eine Klasse mehr als einmal auf einer Seite deklarieren. Sie können das Problem beheben, indem Sie diese Klasse entweder mit einer if-Anweisung (wie unten) umschließen oder sie in eine separate Datei einfügen und require_once()stattdessen verwenden include().

if (!class_exists('TestClass')) {
   // Put class TestClass here
}
Sam
quelle
5
es ist class_exists ('TestClass') === false oder! class_exist ('TestClass')
Jens A. Koch
2
In @ Jens-AndréKoch Kommentar fehlt ein "s" im zweiten Beispiel -> es ist class_exists('TestClass') === falseoder!class_exists('TestClass')
Furins
Wahr. Vielen Dank für den Hinweis. Nicht mehr bearbeitbar. Timeout.
Jens A. Koch
Danke für diese Logik.
Frank
21

Verwendung include_once();- damit werden Ihre Codes nur einmal aufgenommen.

Farhad
quelle
15

Dies wird passieren, wenn wir eine der eingebauten Klassen in der PHP-Bibliothek verwenden. Ich habe den Klassennamen als Verzeichnis verwendet und den gleichen Fehler erhalten. Wenn Sie zuerst eine Fehlermeldung erhalten, stellen Sie sicher, dass der von Ihnen verwendete Klassenname nicht zu den integrierten Klassen gehört.

Ajeesh
quelle
Goldene Antwort hier für mich - ich hätte nicht gedacht, dass PHP den gleichen Klassennamen haben könnte, den ich verwendet habe!
Jamie M
12

Dieser Fehler kann auch auftreten, wenn Sie die __constructMethode mehrmals definieren .

yonicsurny
quelle
2
Dies sollte ein Kommentar zu der bereits akzeptierten und hoch bewerteten Antwort sein
Jaroslaw
8

Manchmal geschieht dies aufgrund einiger Fehler in PHPs FastCGI.

Versuchen Sie es neu zu starten. Bei Ubuntu ist es:

service php-fastcgi restart
Luchaninov
quelle
Ok, es ist eine Lösung, aber es behebt das Problem nicht. In meinem Fall tritt das Problem zufällig ein- oder zweimal im Monat auf. :(
SkaJess
@SkaJess - Sie können crontab den Befehl restart hinzufügen, um stündlich neu zu starten. schmutzig - stellt jedoch sicher, dass die maximale Ausfallzeit Ihrer Website 1 Stunde beträgt.
Luchaninov
@how - es ist keine gute Lösung für mich, weil PHP während des Arbeitstages herunterfällt. Ich denke, dass ich auf eine Weise täglich während der Nacht einen Neustartbefehl hinzufügen werde. Auf dem zweiten Weg werde ich erwägen, IIS und PHP zu aktualisieren.
SkaJess
6

Ich hatte das gleiche Problem bei der Verwendung autoloadwie folgt:

<?php

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


__autoload("MyClass1");

$obj = new MyClass1();

?>

und in anderen Klassen gab es:

namespace testClassNamespace;


class MyClass1
{

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

Die Lösung besteht darin, die Namespace-Kompatibilität beizubehalten, in meinem Beispiel namespace testClassNamespace;in beiden Dateien.

Jacob
quelle
3

Einfach hinzufügen;

Dieser Fehler kann auch auftreten, wenn Sie versehentlich eine Funktion in eine andere Funktion einfügen.

bretddog
quelle
3

PHP 5.3 (und ich denke auch ältere Versionen) scheint in verschiedenen Fällen Probleme mit demselben Namen zu haben. Ich hatte also dieses Problem, als a die Klasse Login und die Schnittstelle hatte, auf der LogIn implementiert ist. Nachdem ich LogIn in Log_In umbenannt hatte, wurde das Problem behoben.

Juri Sinitson
quelle
3

Tun Sie einfach eine Sache, wenn Sie einen Dateinamen einschließen oder benötigen, nämlich class.login.php. Sie können es folgendermaßen einschließen:

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

Auf diese Weise wird niemals ein Fehler ausgegeben.

Asraful Haque
quelle
2

Diese Funktion druckt einen Stapel, der Ihnen sagt, woher er aufgerufen wurde:

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

Rufen Sie diese Funktion oben in der Datei auf, die Ihre Klasse enthält.

Manchmal wird es nur einmal gedruckt, obwohl Ihre Klasse zwei oder mehr Mal aufgenommen wird. Dies liegt daran, dass PHP tatsächlich alle Klassen der obersten Ebene in einer Datei analysiert, bevor Code ausgeführt wird, und den schwerwiegenden Fehler sofort auslöst. Um dies zu beheben, wickeln Sie Ihre Klassendeklaration in einif(true) { ... } , wodurch Ihre Klasse um eine Ebene nach unten verschoben wird. Dann sollten Sie Ihre beiden Spuren vor schwerwiegenden PHP-Fehlern erhalten.

Dies soll Ihnen helfen, herauszufinden, wo Ihre Klasse mehrmals in ein komplexes Projekt aufgenommen wird.

mpen
quelle
1

Haben Sie Zend Framework verwendet? Ich habe auch das gleiche Problem.
Ich habe es gelöst, indem ich dies in der folgenden Zeile auskommentiert habe config/application.ini:

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

Ich hoffe, dies wird dir helfen.

Praditha
quelle
1

Ein weiterer möglicher Schuldiger ist die Quellcodeverwaltung und ungelöste Konflikte. SVN kann dazu führen, dass dieselbe Klasse zweimal in der Code-Datei mit Konflikten angezeigt wird. zwei alternative Versionen davon ("meine" und "ihre").

Konrad Morawski
quelle
1

Ich bin auf dasselbe Problem gestoßen: Die neuere PHP-Version behandelt nicht dasselbe mit mehreren Einschlüssen derselben Datei (als Bibliothek), daher muss ich jetzt alle meine Includes durch include_once ändern.

Oder diese Tricks könnten helfen, wenn Sie nicht zu viel Unterricht in Ihrer Bibliothek haben ...

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

Ich hatte das gleiche Problem "Schwerwiegender PHP-Fehler: Klasse XYZ.php kann nicht neu deklariert werden".

Ich habe zwei Verzeichnisse wie controllerund modelund habe versehentlich XYZ.php in beide Verzeichnisse hochgeladen (also verursacht eine Datei mit demselben Namen das Problem).

Erste Lösung:

Finden Sie in Ihrem gesamten Projekt und stellen Sie sicher, dass Sie nur eine Klasse XYZ.php haben.

Zweite Lösung:

Fügen Sie Ihrer Klasse einen Namespace hinzu, damit Sie denselben Klassennamen verwenden können.

Muhammad Shahzad
quelle
0

Ich bin auf das gleiche Problem gestoßen. fand heraus, dass der Fall der Klassenname war. Ich habe mich darum gekümmert, indem ich den Namen geändert habe. damit das Problem lösen.

RT
quelle
0

Dies bedeutet, dass die Klasse bereits auf der Seite deklariert ist und Sie versuchen, sie neu zu erstellen.

Eine einfache Technik ist wie folgt.

Ich habe das Problem mit folgendem gelöst. Hoffe das wird dir ein bisschen helfen.

if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}
Mohitesachin217
quelle