Frage

Ich habe ein seltsames Problem.Ich habe eine statische Methode, die Klassen lädt (load_library).Wenn es eine bestimmte Klasse lädt, gibt es einen schwerwiegenden Fehler "Klasse kann nicht neu deklariert werden", aber wenn ich teste, ob die Klasse existiert, bevor ich sie mit der Methode load_library lade, heißt es, dass die Klasse nicht existiert.Der load_library methode funktioniert anderswo ohne solche Fehler.

Wenn ich den load_library Aufruf load_library , heißt es, dass die Klasse nicht gefunden werden kann, wenn die Klasse einige Zeilen später tatsächlich verwendet wird.Seltsamer noch, wenn ich meine angemeldete Klasse abnehme autoload funktion stattdessen funktioniert alles einwandfrei, auch wenn dies autoload die Funktion überprüft nicht einmal das Verzeichnis, in dem sich die Klasse befindet, die ich laden möchte.

Es ist ein kompliziertes Problem mit vielen Dateien, daher ist es schwierig, eine Postleitzahl anzugeben, aber kommt dieses Problem jemandem da draußen bekannt vor?

Meine load_library Methode:

    public static function load_library($name) {
        if (!class_exists($name)) {
            if (file_exists('application/libraries/' . $name . '.php')) {
                include('application/libraries/' . $name . '.php');
            } else {
                trigger_error('Request made for non-existant library ('.$name.').', E_USER_ERROR);
            }
        }
    }

Mein Aufruf der load_library-Methode:

lev::load_library('lev_unit_tester/lev_base_test');

Meine registrierte Autoload-Methode:

    public static function autoloader($name) {
        if (class_exists($name)) return;
        if (file_exists('application/libraries/' . $name . '.php')) {
            include('application/libraries/' . $name . '.php');
        }
    }

Die Klasse, die ich laden möchte (hier tritt der Fehler auf):

abstract class lev_base_test {

}

Die eigentliche Fehlermeldung:

Schwerwiegender Fehler:Die Klasse lev_base_test in / some / path / application / libraries / lev_unit_tester / lev_base_test kann nicht neu deklariert werden.php in Zeile 5

War es hilfreich?

Lösung

versuchen Sie dies

// Check to see whether the include declared the class
    if (!class_exists($class, false)){..}

Andere Tipps

Du rufst deine an load_library methode auf diese Weise :

lev::load_library('lev_unit_tester/lev_base_test');

Was bedeutet, dass Sie testen, mit class_exists(), wenn es eine Klasse namens gibt lev_unit_tester/lev_base_test -- was wahrscheinlich nicht ganz der Fall ist :das ist kein gültiger Name für eine Klasse.

So class_exists() zurückgeben false ;und so versuchen Sie jedes Mal, die Datei einzuschließen, die Ihre Klasse enthält load_library methode aufgerufen wird.


Es gibt kein Problem, wenn Sie Autoloading verwenden, da PHP Ihren Autoloader nur aufruft, wenn Sie versuchen, eine Klasse zu verwenden, die nicht definiert wurde :sobald die Datei, die einer Klasse entspricht, aufgenommen wurde, wird das automatisch geladene für diese Klasse nicht mehr aufgerufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top