Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

Tutorial: Teil2 - Der Autoloader

Diskussion: Tutorial: Teil2 - Der Autoloader im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Hallo zusammen, im ersten Teil hab ich euch gezeigt wie man einen einfachen FrontController aufbauen kann. Aber bis jetzt, ...

Antwort
Alt 15.01.08, 17:18   #1 (permalink)
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 2
Standard Tutorial: Teil2 - Der Autoloader

Anzeige

Hallo zusammen,

im ersten Teil hab ich euch gezeigt wie man einen einfachen FrontController aufbauen kann. Aber bis jetzt, gehen dem FrontController noch ein paar Klassen ab die er zum korrekten arbeiten braucht.

Deshalb erstellen wir uns heute einen Autoloader, der für das includen von allen Klassen verantwortlich ist. Bei einem kleinen Projekt funktioniert das ja noch ganz gut mit include("blablubb.class.php"), doch ab einer bestimmten größe kann man so leicht den überblick der includierten Klassen verlieren. Und hier zeigt dann der Autoloader seine Stärken.

Seit der PHP5 Version gibts eine nette Funktion, die sich __autoload() nennt. Diese Funktion includiert automatisch Files. Das mal als sehr grobe Erklärung. Was Sie genau macht, könnt Ihr euch ja hier durchlesen.

Ok, als ersten öffnen wir die im ersten Teil unter core angelegte AutoLoader.class.php Datei, und erstellen darin die Klasse mit ihren Attributen und Methoden.

PHP-Code:


class AutoLoader {
    
    private static 
$packages = array(); // Hier werden die zu includierenden Klassen samt Pfad gespeichert
    
    
public function __construct() {
    }

    public static function 
addPackage($package) {
    
    }

    public static function 
addClass($class) {

    }

    public static function 
autoLoadPackage($classname) {

    }

    private static function 
readPath($package) {

    }

    private static function 
hasWildcard($package) {

    }

    private static function 
getPackages() {

    }
}

/**
 * Hier wird die __autoload() Funktion von PHP aufgerufen, die wiederum unsere
 * statische AutoLoader Methode aufruft, in der dann die Datei includiert wird.
 * @param Zu includierende Klasse
 */
function __autoload($classname) {
     
AutoLoader::autoLoadPackage($classname);

Soviel zum Skelett der Klasse.

Als nächstes machen wir uns an die implementierung der einzelnen Methoden.

PHP-Code:


    
/**
     * Lädt entweder eine Klasse oder falls ein * Wildcard
     * angegeben wurde das komplette Verzeichniss ein.
     * Das ganze sollte aber mit bedacht eingesetzt werden.
     * 
     * @param string "Pfad/Dateiname" "Pfad/*"
     */
    
public static function loadPackage($package) {
        
// Prüfen ob es sich um eine Datei handelt
        
if (is_file($package) && ! in_array($packageself::$packages)) { 
            
self::$packages[] = $package;          
        } else {
            if (
self::hasWildcard($package)) { // Auf Wildcards prüfen           
                
self::readPath($package); // Falls Wildcards gefunden wurden, wird das Verzweichniss eingelesen.                 
            
}
        }         
    } 
Man könnte/sollte hier natürlich noch ein Exception-/Error-Handling einbauen, das ganze gilt auch für die nachfolgenden Methoden.

PHP-Code:


    
/**
     * Nimmt eine einzelne Datei/Klasse auf.
     *
     * @param string "Pfad/Dateiname"
     */
    
public static function addPackage($package) {
        
// Das gleiche wie unter loadPackage()    
        
if (is_file($package) && ! in_array($packageself::$packages)) {
            
self::$packages[] = $package;                                         
        }  
    } 
Jetzt machen wir uns an die wichtigste Methode in dieser Klasse, der autoLoadPackage() Methode.

PHP-Code:


    
/**
      * Diese Methode wird von der function __autoload()
      * aufgerufen. Sie ist es, die die Klassen includiert.
      * 
      * @param string Classname
      */    
    
public static function autoLoadPackage($classname) {        
        foreach (
self::$packages as $package) {            
            if (
strstr($package$classname)) {                
                require_once(
$package);
            }
        }
    } 

PHP-Code:


    
/**
     * Diese Methode liest alle Klasse/Files in einem Verzeichniss ein.
     *
     * @param string Pfad
     */
    
private static function readPath($package) {
        
// Wildcards entfernen
        
$package preg_replace('/[*|*.*]/','',$package);
        
// Verzeichniss öffnen
        
$dir opendir($package);
        
// Verzeichniss auslesen und zum Package-Array hinzufügen
        
while ($file readdir($dir)) {            
            if (!
is_dir($package.$file)) {                
                
self::addPackage($package.$file);                               
            } 
        }
        
// Verzeichniss wieder schliessen
        
closedir($dir);
    } 
So, jetzt sind wir fast am Ende der Klasse angekommen.

PHP-Code:


    
/**
     * Prüft das Package auf Wildcards
     *
     * @param string Pfad
     */
    
private static function hasWildcard($package) {
        if (
preg_match('/[*|*.*]/',$package)) {
            return 
true;
        }
        return 
false;
        
    } 
Die letzte Methode ist eigentlich nur dafür gedacht, dass man sich mal alle geladenen Files holen kann.

PHP-Code:


    
private static function getPackages() {
        return 
$this->packages;
    } 
Gut, und schon sind wir am Ende der Klasse angekommen. Die Klasse als ganze, gibts im Anhang.

Bei fragen einfach hier antworten, danke.

Im nächsten Teil machen wir uns dann an eine kleine Template-Klasse.

Also, bis denne.
Angehängte Dateien
Dateityp: zip AutoLoader.class.zip (847 Bytes, 137x aufgerufen)
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Alt 13.03.08, 20:01   #2 (permalink)
Member of Honour
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 62
Standard

heyho,

was ich bei dem autoloader von dir nicht so ganz verstehe ist die tatsache, dass ich ja dennoch erstmal die files via addPackage() bzw. addPath() hinzufügen muss, führt das die eigentlich intention dieser __autoload function nicht ad absurdum?
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist gerade online   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 13.03.08, 23:21   #3 (permalink)
Themenstarter
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 2
Standard

Naja, die __autoloader() Funktion muss ja wissen wo sich die Klasse befindet. Deshalb dieses addPackage() und addClass(), denen ja nur der Pfad und/oder die Klasse übergeben wird.

Zitat:
führt das die eigentlich intention dieser __autoload function nicht ad absurdum?
Nö, da die __autoloader() Funktion dafür da ist, Klassen die includiert werden müssen, wirklich erst dann zu includieren, wenn z.B. eine Instanz der Klasse erzeugt wird.

Wenn sich Deine Klassen alle im gleichen Verzeichnis befinden, kannst Du dass ja der __autoloader() Funktion mit auf den Weg geben.

Ab der PHP 5.3 Version funktioniert das ganze dann viel schöner, denn dann gibts endlich Namespaces für PHP.
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Alt 01.04.08, 20:16   #4 (permalink)
 
Registriert seit: 01.04.08
.wired Leistung: Facit NTK
Likes: 0
Standard

Sehr geiles Tutorial, auch wenn ich es nur überflogen habe. Vielleicht habe ich ja noch ein paar Fragen dezu, wenn ich mich näher damit befasse, auf jeden Fall ist es genau, was ich suche.

Eine etwas persönlichere Frage: Was für ein Programmierer bist du denn genau? Eben PHP? PERL? Oder gar nicht mal Websprachen, sondern eher zu C hin?

MfG .wired
.wired ist offline   Mit Zitat antworten
Alt 01.04.08, 21:45   #5 (permalink)
Themenstarter
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 2
Standard

Zitat:
Eine etwas persönlichere Frage: Was für ein Programmierer bist du denn genau? Eben PHP? PERL? Oder gar nicht mal Websprachen, sondern eher zu C hin?
Tja, ich bin Programmierer. Die Sprache ist egal, klar, ich habe meine Lieblingssprachen welche PHP und C# wären aber ich programmiere auch in C/C++, Java, VB, Delphi usw.. Es kommt halt immer drauf an was ich machen will. Aber eigentlich bin ich reiner PHP-Programmierer.
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » Tutorial: Teil2 - Der Autoloader
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
"Aus klein mach groß": Teil2 - Zahlen und Satzzeichen CDW Programmieraufgaben 8 24.02.08 01:58
php pdf Tutorial ? 007Rene (Web-) Design und webbasierte Sprachen 5 11.06.07 15:56
VB Tutorial Arca Code Kitchen 1 04.01.06 01:48
RO Tutorial nasir Network · LAN, WAN, Firewalls 2 17.09.05 19:23


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61