Lösung für __autoload (Interzeptormethode)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Lösung für __autoload (Interzeptormethode)

    Hi Profis!

    Ich habe ein Problem, dass ich nicht lösen kann.
    Ich hab schon viel gegoogelt und viel in Foren gelesen, aber eine saubere Lösung hab ich nicht wirklich gefunden.

    Also es geht um folgendes:

    Mit der Interzeptormethode: __autoload
    wird eine Klasse automatisch geladen.
    Soweit so gut.

    Ich suche jetzt eine Lösung um Klassen automatisch zu laden, die nicht in einem Ordner liegen d.h. in Unterordner.

    Beispiel: libs/Debugger/DebuggerComposite.php

    Hat jemand eine passende Lösung für mich?

    Die Lösung mit Ordner + Unterordner auslesen und dann überprüfen ob die Datei bzw. Klasse existiert gefällt mir nicht, da bei einem großem Projekt die Performance, denke ich, darunter leiden wird.

    Vielen Dank und liebe Grüße,
    Stefan

  • #2
    eine möglichkeit wäre folgendes:

    klassenname: Debugger_Composite

    PHP-Code:
    __autoload $class ) {

    include ( 
    str_replace '_''/'$class ) );


    die datei wird dann im pfad libs/Debugger/Composite.php gesucht

    wobei ich persöhnlich finde das man zwei ordner gut prüfen kann:

    PHP-Code:
     if ( file_exists 'Debugger/' $class ) {
    include ...
    } elseif ( 
    file_exists 'Parse/' $class ) {
    include ...
    } else {
    include ...

    bei zuvielen ordner sollte man seine dateistruktur überdenken
    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

    Kommentar


    • #3
      Hallo tontechniker!

      Erstmal vielen Dank für deine Antwort!

      Wenn es nur zwei Ordner zu überprüfen wären, wäre es kein Problem, ich spreche aber von einer Klassenhierachie von 20 Unterordner + Klassen.

      Die Klassen sind zum Beispiel so Untergebracht:
      Ordner:
      XML
      DB
      CACHE
      FILE
      DEBUG
      EVENTLOG
      .....

      Vielleicht weiß noch jemand eine andere Lösung?

      gruß, stefan

      Kommentar


      • #4
        Original geschrieben von stefanwie
        Vielleicht weiß noch jemand eine andere Lösung?
        was hast du denn gegen diese lösung? im pear-projekt ist es zumindest auch so umgesetzt.

        alternativ könntest du dir ein array definieren, das die klassennamen und pfade enthält - muss dann allerdings manuell gepflegt werden.

        Kommentar


        • #5
          Hallo 3DMax!

          Die Lösung mit einem vordefinieren Array ist mir auch schon in den Sinn gekommen, ich mach mir nochmal einen Kopf und poste meine Lösung, sobald ich denn eine gefunden habe


          Gruß, Stefan

          Kommentar


          • #6
            QUOTE]Vielleicht weiß noch jemand eine andere Lösung?[/QUOTE]
            klassenname: Debugger_Composite

            PHP:
            __autoload ( $class ) {

            include ( str_replace ( '_', '/', $class ) );

            }

            die datei wird dann im pfad libs/Debugger/Composite.php gesucht
            hast du das gelesen?
            Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

            Kommentar


            • #7
              hast du das gelesen?
              natürlich hab ich das gelesen, allerdings arbeite ich mit einem Framework, ich kann dieses Framework nicht auf deine Methode umschreiben
              Es sind zu viele Klassen die ineinander verzweigt sind.


              Gruß, Stefan

              Kommentar


              • #8
                achso, zu dem array fällt mir noch ein, das man das noch automatisieren könnte. ein script, das bei bedarf alle ordner ausliest, und dann das array serialisiert.

                Kommentar


                • #9
                  Original geschrieben von stefanwie
                  [B]natürlich hab ich das gelesen, allerdings arbeite ich mit einem Framework, ich kann dieses Framework nicht auf deine Methode umschreiben
                  Es sind zu viele Klassen die ineinander verzweigt sind.
                  Ehrlich gesagt verstehe ich den einwand nicht. Wenn das framework
                  ebenfalls klassen automatisch läd, dann halt dich an die
                  konventionen des frameworks und schau wie das vom fw gelöst
                  wurde. Dann baust du deine klassen so dass sie konform gehen.
                  Wenn nicht, um so besser, dann kann es dir
                  egal sein und du machst es wie du es willst.

                  greets
                  (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                  Kommentar


                  • #10
                    natürlich hab ich das gelesen, allerdings arbeite ich mit einem Framework, ich kann dieses Framework nicht auf deine Methode umschreiben
                    dann schau dir die klassen des frameworks genau an und überlege wie man sie trenne kann ...

                    beispiel "libs/Debugger/DebuggerComposite.php" - trenne halt nach großbuchstaben

                    die lösung mit dem array wäre im zweifelsfall auch nicht schlecht ... die ordner des frameworks ändern sich ja nicht, für deine eigenen überlegst du dir was
                    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                    Kommentar


                    • #11
                      Man könnte ja auch einfach vor dem include im autoload include_path entsprechend konfigurieren - wenn es einem nichts ausmacht, dass das Script dann selber erst mal auf die Suche gehen muss, wo die Klassen nun wirklich liegen.
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar

                      Lädt...
                      X