Sven Rautenberg: Datei include dauert sehr lange

Beitrag lesen

Moin!

if(!class_exists('KLASSE')) {

//-- include Datei b
}


>   
> An der Stelle hat Sven natürlich recht, hier wird Code ausgeführt. In meiner überheblichen Art hätte ich jedoch niemals gedacht dass hier ein Problem sein könnte. Zumal meine ersten Tests hier keinen Zeitfresser ausmachten, aber da hab ich wohl unsauber getestet.  
> Ich konnte die Funktion class\_exists als Zeitfresser ausmachen. Aber nur in unserem richtigen System. Das System benutzt nämlich die tolle funktion \_\_autoload. Diese wiederum haben wir mit ein wenig Logik versehen. Die sucht in Verzeichnissen nach einer Klasse. (nebenbei, die aufgepimpte Autload funktion sollte ich generell mal vorstellen)  
  
Lieber nicht. Du hast einen Performancefresser als Autoloader gebaut, sowas will man vermeiden.  
  
Der aktuelle Stand ist, dass man jeglichen Code in PHP kompatibel zu "PSR-0" macht und dann irgendeinen PSR-0-Autoloader verwenden kann - die Frameworks bringen alle schon einen mit.  
  
Ein guter Autoloader macht nicht zuviel. Er lädt die Klasse nach genau einem Schema, oder er scheitert. Ob er ran darf, wird so billig wie möglich entschieden - PSR-0-Autoloader reagieren auf ein definiertes Prefix im Klassennamen, sonst gucken sie gar nicht erst im Dateisystem. Wenn er scheitert oder nicht ran durfte, darf das nächste Schema ran. Mehr als ein Schema zu haben ist allerdings ein Zeichen für Überarbeitungsbedarf aufgrund von veraltetem Code.  
  
Solchen veralteten Code lädt man vermutlich am sinnvollsten über einen Classmap-Autoloader, d.h. man hat ein Array mit "Klassenname" => "pfad/dateiname.php" drin.  
  

> Was ich nicht wusste ist das class\_exists() die \_\_autoload funktion auslöst, wenn es die Klasse nicht gefunden hat. Unsere \_\_autoload funktion sucht dann in diversen Verzeichnissen nach einer bestimmten Datei und liefert am Ende false zurück, da diese Datei nicht unserer Struktur entspricht. Und dieser Suchvorgang dauert eben ein wenig.  
  
class\_exists hat zwei Parameter.  
  
Andererseits: Warum werden in eurem Code nicht ALLE Klassen per Autoloader geladen? Dann muss man solches Gehampel nicht mehr tun, weil die Dateidefinition nur dann geladen wird, wenn die Klasse bei ihrer ersten Verwendung unbekannt war.  
  
 - Sven Rautenberg