13 Stimmen

Gibt es eine Möglichkeit, CLASS_EXISTS und __autoload ohne CRASH des Skripts zu verwenden?

Exemple :

Klassenname.php

<?php echo "This will crash all"; ?>

In einer anderen Datei...

foreach ($FILENAMES_WITHOUT_DOT_PHP as $name => $value) {
    if (class_exists( $value )) {
      echo "ClassName exists...";
    }
    else {
      echo "ClassName doesn't exists....";
    }
}

Die Ausgabe dieses Codes ist: Dies führt zum Absturz aller

Stattdessen: ClassName existiert nicht....

Autoload-Funktion:

function __autoload( $var_class )
{
     require_once( "$var_class.php") ;
}

15voto

Brian Fegter Punkte 663

Mit class_exists wird der Autoloader standardmäßig getroffen, weshalb Sie Ihr Problem zu sehen sind. Sie können den registrierten Autoloader umgehen, indem Sie den zweiten Parameter auf false setzen.

class_exists('foo', false)

From PHP Documentation

12voto

ircmaxell Punkte 159431

Also, so funktioniert es intern.

Wenn Sie versuchen, eine Klasse zu verwenden, die nicht existiert, ruft sie jede der spl_autoload Rückrufe einen nach dem anderen, bis die Klasse existiert (und die __autoload Funktion ist eine von ihnen). Wenn sie am Ende der Kette nicht vorhanden ist, wird der Fehler "Klasse nicht gefunden" ausgegeben.

Wenn Sie anrufen class_exists ohne den zweiten Parameter (der ihm sagt, dass er nicht versuchen soll, es zu laden, wenn es nicht existiert), ruft er die Kette von spl_autoload Rückrufe, bis entweder die Klasse gefunden oder die letzte Methode aufgerufen wird. Dann kehrt es zurück, wenn es die Klasse gefunden hat.

Es hängt also alles davon ab, was Sie in der Autoload-Funktion tun. Wenn Sie etwas tun wie:

function __autoload($class) {
    $filename = PATH_TO_CLASSES . $class . '.php';
    if (!file_exists($class)) {
        die('Could not find '.$class);
    }
    require_once $filename;
}

Es wird die Ausführung verhindern und nicht wie vorgesehen funktionieren. Stattdessen sollten Sie dies tun:

function __autoload($class) {
    $filename = PATH_TO_CLASSES . $class . '.php';
    if (file_exists($class)) {
        require_once $filename;
    }
}

Das ist alles, was Sie tun müssen.

Sie wollen nicht, dass die Datei ausgeführt wird. Das ist auch in Ordnung. Dafür gibt es eine einfache Lösung. Legen Sie diese Datei nicht in dasselbe Verzeichnis wie Ihre automatisch geladenen Klassen. Das macht den Zweck des Autoloadings zunichte.

Die einzige andere Lösung wäre, eine Zuordnung von Klassennamen zu Dateinamen zu speichern und das Autoloading darauf aufzubauen. Andernfalls würde es immer die Datei ausführen (da das ist, was Sie bitten, es zu tun) ...

1voto

AutoSponge Punkte 1446

Verwenden Sie class_exists innerhalb der Autoload-Funktion und verwenden Sie sie dann nie wieder. Das ist der Sinn des Autoloaders.

class App {
    static private $_instance = NULL;

    public function __construct() {
        spl_autoload_register('app::autoLoader');
    }

    public function __destruct() {
    }

    public static function getInstance() {
        if(self::$_instance == NULL) {
            self::$_instance = new App();
        }
        return self::$_instance;
    }

    public static function autoLoader($class) {
        $className = stripslashes($class);
        if (class_exists($className)) {
            return;
        }
        require $className.'.class.php';
    }
}

0voto

wimvds Punkte 12683

Was geschieht, ist ganz logisch. Ihre __autoload-Funktion ist wahrscheinlich nur einschließlich ClassName.php, so dass es die echo-Anweisung, die Sie dort bekommen haben, ausführen wird.

Wenn Sie herausfinden wollen, ob eine Klassendefinition in einer Datei vorhanden ist, können Sie den Inhalt der Datei lesen (mit file_get_contents oder eine ähnliche Funktion), und durchsuchen Sie dann diese Inhalte nach einer Klassendefinition mit Hilfe von regulären Ausdrücken oder mit token_get_all (siehe Feststellen, welche Klassen in einer PHP-Klassendatei definiert sind ).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X