Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Eine 'dynamische' Klasse

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Eine 'dynamische' Klasse

    Hey Leute,

    ich wende mich heute an das Forum - besonders an die Fortgeschrittenen - weil ich etwas umsetzen möchte, wo ich selber etwas ans Grübeln komme.

    Und zwar wollte ich eine Klasse erstellen, die automatisch ein Verzeichnis ausliest, die dortigen Klassen öffnet und ausführt, sodass sie dann nutzbar sind. Die Klasseninstanzen sollen dabei in $this->variablen gespeichert werden.

    Das unglaubliche Problem - die Klassen zu öffnen - besonders, weil man nicht weiß wie viele es sind und wie sie heißen.

    Ist das überhaupt möglich? Hier, was ich bis jetzt auf die Beine gestellt habe:

    Ich habe ein Verzeichnis, das so aussieht:
    Code:
    ../
    ./
    files/
    modules/
    layout.php
    frameBundle.class.php
    Hierbei wird im Ordner files Dateien zwischengespeichert, in modules sind dann alle Unterklassen, die ich öffnen möchte. frameBundle.class.php ist die Hauptklasse, die die öffnen soll und layout.php ist nur eine Testdatei, die frameBundle.class.php öffnet.

    In modules habe ich bis jetzt nur eine Unterklasse, die ich errorHandler.module.class genannt habe. Sie ist an sich fertig.

    Nun hier der frameBundle.class.php :

    PHP-Code:

    class frameBundle {
        
        
        private 
    $fileDir;
        
        private 
    $moduleDir;
        
        private 
    $ressources = array();
        
        public function 
    __construct()
        {
            
            
    // define file
            
    $this->fileDir './files/installLog.xml';
            
    $this->moduleDir './modules';
            
            if( 
    file_exists$this->fileDir ) )
            {    
    // load modules
                
                
                
            
    }
            else
            {    
    // install modules
                
            
                
    $dir dir$this->moduleDir );            // open dir
                
    $this->ressources = array();            // set array
                
                
    for( ; $read $dir->read();  )
                {
                    
                    if( 
    $read == '.' || $read == '..' )
                    {

                        
    // because || doesn't work
                        
                    
    }
                    else
                    {
                        
                        
    array_push$this->ressources$read );
                        
                    }
                    
                }
                
                
    $dir->close();
                
                
    // install modules using ressources
                
    self::installModules();
                
            }
            
        }
        
        
        private function 
    installModules()
        {
            
            if( empty( 
    $this->ressources ) )
            {    
    // no modules loaded
                
                
    echo( 'BundleError: No Ressources' );
                
            }
            else
            {
                
                foreach( 
    $this->ressources as $res )
                {
                    
                    require_once( 
    $res );
                    
    $moduleName str_replace$res'.module.php' );
                    
    $this->$moduleName = new $moduleName;
                    
                }
                
                
    var_dump$this->errorHandler );
                
            }
            
        }

    Alles noch ein bisschen verwurstelt. Habe da noch einige Sachen ausprobiert

    Wäre über eine rege Diskussion sehr erfreut.


    Grüße,


    Eb aka Areiker


  • #2
    Man nennt sowas Autoloader, sowas gibt es bereits und ist eigentlich nicht mal was fortgeschrittenes
    Fatal Error: Windows wird gestartet

    Wie administriert man ein Netzwerk: Beispiel

    Kommentar


    • #3
      Hallöchen,

      für simples Autoloading out of the box empfehle ich Composer.

      composer.json
      PHP-Code:
      {
          
      "autoload":{
              
      "psr-4":{
                  
      "MyProject\\""src/"
              
      }
          }

      index.php
      PHP-Code:
      <?php

      require_once(__DIR__ '/vendor/autoload.php');

      // ..
      Viele Grüße,
      lotti

      Kommentar


      • #4
        Zitat von Areiker Beitrag anzeigen
        Und zwar wollte ich eine Klasse erstellen, die automatisch ein Verzeichnis ausliest, die dortigen Klassen öffnet und ausführt, sodass sie dann nutzbar sind. Die Klasseninstanzen sollen dabei in $this->variablen gespeichert werden.
        Ich glaube nicht das Autoloader das hier erschlagen. Wäre mir neu, das Autoloader bereits Container mit den Klasseninstanzen liefern. Es ist ja grad einer der Vorteile von Autoloadern, nicht automatisch alle Klassen zu laden und Instanzen zu erstellen.

        Für mich stellt sich jedoch die Frage, warum im Vorfeld hier bereits Instanzen von allen Klassen erstellt werden sollen.
        Um dies zu realisieren, sind einige Vorraussetzungen notwendig:
        1. Eine Klasse = eine Datei
        2. Klassenname ist aus dem Dateinamen ableitbar
        3. Der Konstruktor aller Klassen benötigt keine Parameter oder die Parameter sind bereits im Vorfeld verfügbar.

        Spätestems mit Punkt 3 wird das höchst unflexiebel.
        Schau dir mal an, wie Autoloader funktionieren und vergleiche das mit deinem Konzept.

        LG jspit
        PHP-Klassen auf github

        Kommentar


        • #5
          Zitat von jspit Beitrag anzeigen
          Um dies zu realisieren, sind einige Vorraussetzungen notwendig:
          1. Eine Klasse = eine Datei
          2. Klassenname ist aus dem Dateinamen ableitbar
          3. Der Konstruktor aller Klassen benötigt keine Parameter oder die Parameter sind bereits im Vorfeld verfügbar.
          Ja, genau so hab ich es mir auch vorgestellt. Lese mich gerade in Autloader ein. Melde mich, wenn ich die kapiert habe. Danke schon mal dafür.

          Kommentar


          • #6
            Okay Leute,


            hab mir autoloader angeschaut und gemerkt, dass ich das nicht wirklich brauche. Hab mir mein Design noch etwas überdacht und etwas abgeändert.

            Anstatt die Klassen automatisch aus dem Verzeichnis auslesen zu lassen hab ich es semi-automatisch gelöst, indem eine XML-Datei hinterlegt ist, in die alle installieren Module eingetragen werden. So kann ich sie dann problemlos laden und funktioniert super

            Kommentar


            • #7
              Zitat von Areiker Beitrag anzeigen
              hab mir autoloader angeschaut und gemerkt, dass ich das nicht wirklich brauche
              Wofür "nicht ... brauche"?
              Dein Code oben ist voller Fehler und schreit geradezu, dass du keine Ahnung hast, was du da tust. Es gibt ein Grund, warum quasi >90% aller mindestens forgeschrittenen Entwickler "Autoloading" verwenden. Viele davon via Composer. Wenn du etwas nicht verstehst, dann frag nach. Gerade für (dynamische) Plugin/Modulsysteme ist Autoloading perfekt.
              Standards - Best Practices - AwesomePHP - Guideline für WebApps

              Kommentar

              Lädt...
              X