3. August 2007 Wie man __autoload richtig benutzt

in Kategorie PHP


Im heutigen Artikel geht es um die in PHP5 eingeführte Funktion __autoload(). In einem Projekt mit vielen Klassen wird es oft schnell unschön jede Datei einzeln mit include oder require einzubinden. Im folgenden werde ich __autoload() vorstellen und darlegen wie es in der Praxis zu verwenden ist.

Einstieg in __autoload

Nehmen wir an unsere PHP-Klassen liegen alle in einem Unterordner »includes« und die Dateinamen ergeben sich aus dem Klassennamen und der Endung .php dann ist es ganz einfach sich seine eigene __autoload-Funktion zu schreiben:

1
2
3
function __autoload($className) {
	require_once 'includes/'.$className.'.php';
}

Wenn nun eine Klasse verwendet wird, die noch nicht eingebunden wurde, ruft PHP unsere __autoload-Funktion auf und übergibt gleichzeitig den geforderten Klassennamen. Da wir ja wissen wo die Klasse zu finden ist können wir diese auch einbinden. Mit __autoload werden also nur die Klassen geladen, die auch wirklich verwendet werden.

Ordnerstrukturen schaffen

Alle Klassendateien in einem einzigen Ordner zu sammeln kann bei großen Projekten sehr schnell unübersichtlich werden. Deshalb wollen wir nun Klassen, die zusammen gehören, in weiteren Unterordnern zusammenfassen.

Wenn eine Klassendatei nun beispielsweise in »includes/MyPackage/MyClass.php« liegt, dann ergibt sich daraus auch der Klassenname: MyPackage_MyClass. Wer regelmäßig Pear-Klassen nutzt dem wird diese Namensgebung sicherlich bekannt vorkommen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function __autoload($className) {
	$inc = 'includes/';
	$arr = explode('_', $className);
 
	// alle Teile des Klassennames sind Ordner
	// es können deshalb auch Ordner 
	// ineinander verschachtelt werden
	while(sizeof($arr) > 1) {
		$inc .= array_shift($arr).'/';
	}
	$inc .= array_shift($arr).'.php';
 
	require_once $inc;
}
 
$obj = new MyPackage_MyClass();

Mehrere __autoload’s

Manche Frameworks und Codestücke verwenden bereits __autoload. Wenn wir nun aber noch zusätzlich eine eigene __autoload-Funktion benötigen können wir diese nicht einfach noch einmal deklarieren. Gegen dieses Problem bietet PHP seit der Version 5.1.2 eine elegante Lösung:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// eine Funktion
function myAutoload($className) {
	...
}
 
// eine Klasse mit einer statischen Methode
class myClass {
	public static function autoload($className) {
		...
	}
}
 
if(function_exists('__autoload')) {
	spl_autoload_register('__autoload');
}
spl_autoload_register('myAutoload');
spl_autoload_register(array('myClass', 'autoload'));
 
// sogar nicht statische Methoden können verwendet werden,
// wenn eine entsprechende Instanz übergeben wird
$obj = new myClass();
spl_autoload_register(array($obj, 'autoload'));

Beachte: Wenn spl_autoload_register() aufgerufen wird, verliert eine bereits existierende __autoload-Funktion ihre Wirkung. Deshalb muss diese explizit registriert werden.

Fazit

PHP5 bietet mit __autoload eine einfache und praktische Möglichkeit objekt-orientierten Code sauber zu strukturieren und den Aufwand beim Einbinden dennoch extrem gering zu halten.

Es sind leider keine ähnlichen Artikel vorhanden.


Der Beitrag wurde am Freitag, den 3. August 2007 um 12:01 Uhr veröffentlicht und wurde unter PHP abgelegt. du kannst die Kommentare zu diesen Eintrag durch den RSS 2.0 Feed verfolgen. du kannst einen Kommentar schreiben, oder einen Trackback auf deiner Seite einrichten.

Kommentare

Keine Reaktion zu “Wie man __autoload richtig benutzt”.

Einen Kommentar schreiben