Zum Inhalt springen

PHP: Classloader per __autoload


Empfohlene Beiträge

Hi Leute,

ich bin grad ein bisschen am tüfteln mit netten php5 funktionalitäten :P

Wenn ich jetzt eine funktion definiere:


function __autoload($classname) {
require_once($classname . '.class.php');
}
[/PHP]

Das ganze funktioniert jetzt aber nur wenn ich alle Klassen im selben Verzeichnis liegen habe ...

Jemand ne idee wie man eine schnelle methode findet klassen automatisch zu laden? Ich könnte das ganze ja mit opendir() etc. machen aber das dürfte das script ja doch um einiges verlangsamen ... gibts da ne Möglichkeit oder sollte ich dann im Endeffekt doch lieber mit ganz normalen requires bzw. require_onces arbeiten?

mfg

Eth

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, die Funktion __autoload() ist eigentlich dafür gedacht, dass eine benötigte Klasse nur bei Bedarf geladen wird. Wenn du sowieso bei deinem Webprojekt immer Zugriff auf alle deine Klassen haben musst, ist die Variante per require() besser.

Solltest du aber eine Sammlung von Klassen (in einzelnen Dateien in einem Ordner) haben, und du brauchst mal diese und mal jene Klasse, ist die Funktion __autoload() von Vorteil. Wenn du in deinem Script eine Instanz einer Klasse erzeugen willst, und diese Klasse ist noch nicht deklariert, wird die Funktion __autoload() aufgerufen. Als Parameter enthält sie den Klassennamen. Dann kann man per include() oder require() die entsprechende Datei laden. Danach wird PHP automatisch versuchen, die Instanz erneut zu erstellen.

Beispiel:


<?
function __autoload($classname) {
include($classname."class.php");
}

$link = new DB_Klasse;
?>[/PHP]

Hier wird zuerst die Datei "DB_Klasse.class.php" eingebunden und dann wird versucht eine Instanz von DB_Klasse zu erzeugen. Sollte in der eingebundenen Datei nicht die Klasse DB_Klasse vorhanden sein, wird natürlich ein Fehler erzeugt.

Ich hoffe mal, dass ich dir damit ein wenig helfen konnte.

// ssambdar

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ganze funktioniert jetzt aber nur wenn ich alle Klassen im selben Verzeichnis liegen habe ...

ini_set("include_path", ".:/mein/absoluter/pfad/zu/den/klassen/und/ihren/subordnern:/noch/ein/include/pfad:/und/noch/einer");

Falls du es nicht zur Laufzeit definieren willst, so kannst du es natürlich auch fest in der php.ini aufschreiben.

Dann findet __autoload auch Klassen aus anderen Verzeichnissen. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm ... also prinzipiell gesehen werden an sich schon alle klassen benötigt.

Also selbst wenn du wirklich alle Klassen brauchst, und die Abhängigkeiten verstreut sind, dann würde ich dir wirklich zu __autoload raten.

Ich sehe keinen besonderen Grund warum man ein statisches require dem dynamischeren __autoload vorziehen sollte.

Wenn man alle requires per Hand aufschreibt schleichen sich imo viel eher Fehler ein (z.B.) Reihenfolge als wenn du sie dynamisch lädst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jetzt stellt sich allerdings wieder die Frage wie ich meine dynamischen includes am sinnvollsten einbinde...

wenn ich require_once o. Ä. benutze, werden dann auch unterverzeichnisse des include_path durchsucht oder muss ich jedes verzeichnis separat spezifizieren? Nicht dass es ein Problem ist... :P

mfg

Eth

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab mir da grad ma was nettes gebaut ^^:


<?php

class ClassLoader {

private static $pathInitialized = false;

public static function autoLoad($classname) {

if ( !self :: $pathInitialized ) {
self :: initializePath();
}

self :: loadClass($classname);
}

private static function initializePath() {
$currentIncludePath = ini_get('include_path');
$includePaths = explode(':',$currentIncludePath);

$libDir = realpath(realpath(dirname(__FILE__) . '/../'));

$dirTree = self :: buildDirTree($libDir);

foreach ( $includePaths as $includePath ) {
if ( !in_array($includePath,$dirTree) ) {
array_unshift($dirTree,$includePath);
}
}

$includePathComplete = implode(':',$dirTree);

ini_set('include_path',$includePathComplete);

self :: $pathInitialized = true;
}

private static function buildDirTree($dir) {
$dirList = array();

$dirHandle = opendir($dir);

while ( $currentDir = readdir($dirHandle) ) {
$fullCurrentDir = $dir . '/' . $currentDir;

if ( is_dir($fullCurrentDir) && $currentDir!='.' && $currentDir!='..' ) {
$dirList[] = $fullCurrentDir;
$dirContent = self :: buildDirTree($fullCurrentDir);
foreach ( $dirContent as $dirContentEntry ) {
$dirList[] = $dirContentEntry;
}
}
}

return $dirList;
}

private static function loadClass($classname) {
require_once($classname . '.class.php');
}

}

function __autoload($classname) {
ClassLoader :: autoLoad($classname);
}

?>

[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...