Es ist ein Weg, um CLASS_EXISTS und __autoload ohne CRASH das Drehbuch?
Beispiel:
ClassName.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:
Dieser Absturz alle
Statt dieser:
ClassName nicht vorhanden ist....
Autoload-Funktion:
function __autoload( $var_class )
{
require_once( "$var_class.php") ;
}
- obviusly ist notwendig, um autoload, weil die Klasse nicht geladen werden!
- Zeigen Sie Ihre autoload Funktion... Es sollte zeigen
ClassName doesn't exists....
nach derThis will crash all
, da es egal ist standardmäßig aktiviert, wenn die Klasse nicht geladen. Ich vermute, Sie töten die Ausführung in den__autoload
Funktion, wenn Sie nicht die Klasse zu finden, und Sie sollten nicht sein... - Von dem code, ist angesichts der Ergebnisse nicht reproduziert werden können. Also poste etwas mehr code.
- __autoload-Funktion ist eine beliebige Funktion, lädt die Klasse und es funktioniert einwandfrei. Das problem ist, wenn er Dateien findet, die Ausführung von codes, die aus irgendeinem Grund, wie in dem Beispiel
- Was ich versuche zu tun, ist zu wissen, welche Zeichenfolgen sind Klassen oder nicht, eine Liste von DATEINAMEN.
- Nein, zeigen Sie Ihre Funktion. Standardmäßig PHP nicht so verhält, wie Sie beschreiben (>= 5.2 mindestens). So, die Ursache ist mehr als wahrscheinlich in Ihrem code. Also, wenn Sie zeigen Sie Ihre code, vielleicht können wir helfen. Ansonsten ist es alles nur ein Schuss im Dunkeln...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, also hier ist, wie es intern arbeitet.
Wenn Sie versuchen, verwenden Sie eine Klasse, die nicht existiert, ruft es nacheinander die
spl_autoload
Rückrufe eins nach dem anderen, bis die Klasse existiert (und die__autoload
- Funktion ist einer von Ihnen). Wenn es nicht vorhanden ist am Ende der Kette, wirft er die Klasse nicht gefunden Fehler.Beim Aufruf
class_exists
ohne den zweiten parameter (das besagt nicht, zu versuchen, es zu laden, wenn es nicht vorhanden ist), ruft er die Kette vonspl_autoload
Rückrufe, bis entweder er findet die Klasse, oder die Letzte Methode, die aufgerufen wird. Dann kehrt er zurück, wenn er fand das Klasse.Also es hängt alles davon ab, was du tust, in der autoload-Funktion. Wenn Sie so etwas wie:
Töten Ausführung und es wird nicht so funktionieren wie Sie sollen. Stattdessen sollten Sie tun:
Das ist alles, was Sie tun müssen.
Nun, Sie nicht wollen, dass die Datei ausgeführt werden soll. Das ist in Ordnung. Gibt es eine einfache Lösung. Nicht setzen Sie diese Datei in das gleiche Verzeichnis wie die Klassen geladen. Es Niederlagen der Zweck des autoloading.
Die einzige andere Lösung wäre das speichern einer Karte der class-Namen zu Datei-Namen, und begründen Sie Ihre autoloading davon. Sonst würde es immer ausführen, die Datei (da das ist, was Sie Fragen, es zu tun)...
Mit class_exists auf den autoloader standardmäßig, das ist, warum Sie sehen, Ihr Problem. Umgehen kann man die registrierten autoloader ein, indem Sie den zweiten Parameter auf false.
Verwenden class_exists innerhalb der autoload-Funktion, dann verwenden Sie nicht immer wieder. Das ist der Punkt, der den autoloader.
class_exists
innerhalb der autoload-Funktion haben, da Sie wissen, dass es nicht schon (es sei denn, jemand fordert es manuell, aber sollte Sie nicht trotzdem). Oh, und wenn ich Sie wäre, würde ich einige Prüfungen, um festzustellen, ob die Datei tatsächlich existiert, bevor Sie nur tun, einen blindenrequire
auf Sie. Sonst verlieren Sie die Fähigkeit zu überprüfen, um zu sehen, ob eine Klasse ist belastbar (die in handliches kommen kann, wenn ein Adapter, etc)...Was passiert, ist ziemlich logisch. Ihr __autoload-Funktion ist wohl nur darunter ClassName.php so wird ausgeführt, der echo-Anweisung hast du da.
Werden, wenn Sie versuchen zu entscheiden, ob eine class-definition in einer Datei, die Sie Lesen konnte, den Inhalt der Datei (mit file_get_contents oder eine ähnliche Funktion), und Scannen Sie dann diese Inhalte für die definition einer Klasse mit regulären Ausdrücken oder mit token_get_all (siehe Bestimmen, welche Klassen definiert sind, in einer PHP-Klasse Datei).
file_get_contents
oder eine ähnliche Funktion), und Scannen Sie dann diese Inhalte für die definition einer Klasse mit regulären Ausdrücken.token_get_all
(siehe stackoverflow.com/questions/928928/...)