Weiß jemand, was dieses Problem verursachen kann?
Schwerwiegender PHP-Fehler: Klasse kann nicht neu deklariert werden
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Weiß jemand, was dieses Problem verursachen kann?
Schwerwiegender PHP-Fehler: Klasse kann nicht neu deklariert werden
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Antworten:
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.
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.
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
}
class_exists('TestClass') === false
oder!class_exists('TestClass')
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.
Dieser Fehler kann auch auftreten, wenn Sie die __construct
Methode mehrmals definieren .
Manchmal geschieht dies aufgrund einiger Fehler in PHPs FastCGI.
Versuchen Sie es neu zu starten. Bei Ubuntu ist es:
service php-fastcgi restart
Ich hatte das gleiche Problem bei der Verwendung autoload
wie 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.
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.
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.
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.
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").
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
}
Ich hatte das gleiche Problem "Schwerwiegender PHP-Fehler: Klasse XYZ.php kann nicht neu deklariert werden".
Ich habe zwei Verzeichnisse wie controller
und model
und habe versehentlich XYZ.php in beide Verzeichnisse hochgeladen (also verursacht eine Datei mit demselben Namen das Problem).
Finden Sie in Ihrem gesamten Projekt und stellen Sie sicher, dass Sie nur eine Klasse XYZ.php haben.
Fügen Sie Ihrer Klasse einen Namespace hinzu, damit Sie denselben Klassennamen verwenden können.
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");
}