OOP autoload klasse

  • OOP autoload klasse

    Hallo Leute,

    erstmal warum ich nicht registriert bin:
    Der Zutritt zu dieser Seite ist Ihnen leider verwehrt. Sie besitzen
    nicht die notwendigen Zugriffsrechte, um diese Seite aufrufen zu können.
    Thema gabs schon im Offtopic, leider hat es sich für mich noch nicht behoben.

    Zum Thema:

    Ich hab schon so viele Autoload funktionen mit spl und auch so gesehen, jedoch war für mich nichts passendens dabei. Warum?
    Weil jede Datei genauso heißen musste wie die Klasse. Und das wollte ich nicht.
    Warum nicht? Ich will mich von der Masse abheben *muhahah* :D

    Deswegen hab ich nach einer Lösung gesucht und folgenden Code benutzt:

    Quellcode

    1. // Globale Variablen
    2. $mainClasses = array();
    3. $subClasses = array();
    4. function selectClasses($dir) {
    5. // Globale Variablen einbezihene
    6. global $mainClasses;
    7. global $subClasses;
    8. // Ordner öffnen und Dateien in $files speichern
    9. $files = scandir($dir);
    10. // Jede Datei durchforten
    11. foreach($files as $file) {
    12. // Unzulässige Dateien
    13. if(in_array($file, array('.', '..'))) {
    14. continue;
    15. }
    16. // Ist Ordner? Wenn ja dann Function erneut aufrufen
    17. if(strpos($file, '.php') === false) {
    18. selectClasses($dir.'/'.$file);
    19. continue;
    20. }
    21. // Datei einlesen und die ersten 200 Zeichen schauen ob es eine Kindklasse ist oder nicht
    22. $section = file_get_contents($dir.'/'.$file, NULL, NULL, 0, 200);
    23. $section = preg_match('/class (\w+) extends (\w+)/', $section, $treffer);
    24. if(isset($treffer[1])) { # Ist Kindklasse
    25. $subClasses[] = $dir.'/'.$file;
    26. } else { # Ist Vaterklasse
    27. $mainClasses[] = $dir.'/'.$file;
    28. }
    29. }
    30. }
    31. // Funktion öffnen
    32. selectClasses('admin/lib/classes');
    33. // Hauptklasse einbinden
    34. foreach($mainClasses as $class) {
    35. require_once($class);
    36. }
    37. // Kindklassen einbinden
    38. foreach($subClasses as $class) {
    39. require_once($class);
    40. }
    Alles anzeigen



    Was meine Probleme bei den anderen autoload klassen war?

    - Wenn ich eine Subklasse zuerst included hab als die Vaterklasse, kamm ein Error, dass die Vaterklasse natürlich nicht eingebunden war
    - Man musste immer eine Struktur mit den Dateinamen und der Klassennamen haben, was mich natürlich etwas einschrenkte
    - Unterordner wurden nie mit einbezogen

    Nun wollte ich fragen ob ihr verbesserungsvorschläge habt (bis auf Cache :D der kommt noch natürlich ;))

    und wie ihr die Funktion finden :)

    Bin gespannt !!

    Gruß Sysix
  • Ich halte den PSR-Ansatz für sehr gut und denke, du solltest ihn umsetzen. Irgendwann kommt eventuell mal der Tag, wo du eine andere Library einbinden musst. Und dann bist du happy, wenn du es so umgesetzt hast :)

    Dazu kommt, dass deine Umsetzung eine schlechte Performance hat. Wenn du schon Dateien ausliest und nach Klassen suchst, solltest du zumindest cachen. (Aber der kommt ja noch)

    Ich finde also im Endeffekt die Idee nicht so gut und würde es nicht so machen.
    =O
  • Danke aber ich hab hal das Problem, dass ich von den Klassen sozusagen nur den Pfad weiß, dass sie alle im admin/lib/classes drin sind.
    Weiteres weiß ich von den Klassen/dateien nicht.. wie soll ich da eine gescheite autoload funktion bauen?
    es wird auch schon so kommen (Code von dritte), dass die Klassennamen nicht den Dateinamen übereinstimmen.

    Gruß Sysix
  • Wenn der Dateiname nichts mit dem Klassenname am Hut hat, kann man keine gute Autoload-Funktion bauen. Wie soll das auch funktionieren. Autoload stellt nämlich Lazy Loading zur Verfügung. Also einbinden von Bibliotheken zur Laufzeit bzw. zu jenem Zeitpunkt, wo sie benötigt werden.

    Du hast halt nur zwei Möglichkeiten: Du benutzt Autoload (gerne auch mit Namespace) oder du bindest alle Dateien am Anfang des Scripts ein. Dies sollte, wenn es sich um Klassen und Funktionen handelt (bzw. nicht alles im globalen Scope landet), schneller sein als deine bisherige Umsetzung. Der Vorteil von beiden Varianten ist, dass du automatisch auch die Extended-Klassen einbinden kannst.

    Lies dir einfach mal dies hier durch: php.net/manual/de/language.oop5.autoload.php

    Was mir eben noch auffällt ist, dass deine Umsetzung der ersten Variante entspricht ;)
    =O
  • Dsa Proble mit bei mir einfach: Code von Dritte können eingebunden werden (z.B. wenn ich ein CMS jetzt mache und ein Addon hat ne extra Klasse dafür noch)

    aber bei mir hat immoment es folgendes Muster

    new form() = classes/form.pgp
    new formField = classes/form/fields.php
    new formText = classes/form/text.php (Childklasse von formFields)

    glaubst du man kann via regex dann so wunderschön trennen :)? dass es dann auch noch paar ebenen Weiter geht :)?

    new formTextReadonly = classes/form/text/readonly.php (z.B. wird aber nicht kommen :DD)