[OOP] Klasse Dynamisch um neue Methoden erweitern?

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

  • [OOP] Klasse Dynamisch um neue Methoden erweitern?

    Aufgrund der Übersicht würde ich gerne wissen ob es irgendwie möglich ist der Instanz einer Klasse zur Laufzeit neue Methoden hinzuzufügen. Dies soll dabei von der jeweiligen Instanz ausgehen.

    Ich versuche das mal in ein Beispiel zu fassen, in dem auch direkt deutlich wird wozu ich das ganze brauche:

    PHP-Code:
    <?php
    class foo
    {
        
    // Variablen
        
        
        //--------
        
        
        
    public function auto_run$do 
        {
            switch( 
    $do ) {
                case 
    'system':
                    require(
    'die neuen Methoden');
                    
    // erweitere diese Instanz um die neuen Methoden
                
    break;
                default:
                    require( 
    'die neuen Methoden' );
                    
    // erweitere diese Instanz um die neuen Methoden            
                
    break;
            }
        }
    }
    ?>
    Hat jemand ne Ahnung ob das irgendwie geht?
    daniel-portal.com/games Free Games and more

  • #2
    Hi

    http://de3.php.net/manual/de/functio...te-methods.php

    Allerdings bezweifle ich dass das der ideale weg ist. Erzähl
    doch mal etwas detailierter was du machen willst. Beim bloßen
    anschauen des codes und lesen deines textes drängen sich mir
    zwei schlagworte auf: strategy bzw. decorator

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

    Kommentar


    • #3
      Hi,

      Für mich klingts eher nach dem Visitor Pattern.
      Warum programmierst du eine Klasse die nichts kann? Du könntest aus der Klasse ein Interface machen und die konkreten Klassen davon ableiten.

      Gruß Thomas

      Kommentar


      • #4
        Danke für eure Antworten.

        Ich versuche mal möglichst knapp zu schildern was die Problemsituation ist:

        Es handelt sich um ein Modulares CMS System. Das vereinfacht zwei Eingabevariablen besitzt nämlich modul_id und act.
        Je nachdem welche Modul ID angegeben wird, wird eine Entsprechende Modul Class includiert und die in ihr enthaltene auto_run() Methode aufgerufen. Damit die jeweilige Modul class weis was sie machen muss wird nun die Variable act überprüft und eine entprechende Methode inerhalb der Modul Class aufgerufen.
        Soweit so gut nun hat man allerdings das Problem, dass wenn z.B. das entsprechende Modul etwas größer ist (z.b. ein Forum ist) die jeweilege Modul Class sehr sehr groß und unüberschaubar ist zudem werden ständig Methoden geladen die man gar nicht bräuchte.


        //------------------

        Mir würden jetzt nur zwei Lösungswege einfallen die ich aber beide nicht so besonders elegant finde:

        1.) Je nach modul_id wird ein ganz normal PHP Datei includiert. Diese wiederrum includiert dann eine Klasse die der Variable act entspricht (=> nun wieder auto_run() ).

        2.) Es gibt eine Root Class für jedes Modul und wiederrum eine Nebenklasse für jede Varible act. Nun bräucht man nur noch mittels file_exist() prüfen ob die modul_id und act valid sind und könnte dann Root und Nebenklasse includieren wobei die Nebenklasse nun von der Root Class abgeleitet würde.


        Wenn ich so nochmal drüber nachdenke sagt mir 2 noch am ehsten zu aber wie würdet ihr denn das ganze lösen?
        daniel-portal.com/games Free Games and more

        Kommentar


        • #5
          *noch* ein cms
          es gibt diverse patterns, die man dafür hernehmen kann, z.b. das bereits genannte Visitor, oder Command, oder Decorator.
          alle sind wunderbar zu verwenden.

          außerdem:

          PHP-Code:
          class Forum {
             public function 
          auto_run() {
                    switch ( 
          something ) {
                        case 
          SHOW_POSTS:
                               require_once(
          'ShowPosts.php');
                              
          $obj = new ShowPosts();
                              return 
          $obj -> display();
                        case 
          SHOW_TOPIC:
                               require_once(
          'ShowTopic.php');
                               
          $obj = new ShowTopicsomeOther Parameter );
                               return 
          $obj -> display();
                       
          // und so weiter für alle anderen aktionen...
                    
          }
             }

          was hindert dich also daran, aus dem einen, großen forum-modul viele kleine zu machen?

          das, was du versuchst, kann man nicht wirklich als OOP verstehen, und leider haben die leute von php auch an leute wie dich gedacht, und erlauben das überladen bzw. hinzufügen von methoden mithilfe von __call() ...
          http://de3.php.net/manual/en/languag...verloading.php
          grüße
          axo
          Zuletzt geändert von axo; 19.04.2006, 15:15.

          Kommentar


          • #6
            und leider haben die leute von php auch an leute wie dich gedacht
            Wenn das nicht wirklich OOP ist wie macht man es dann OOP? Und warum implentieren die Entwickler eine Funktion wie das überladen wenn es so unsauber ist.
            Wo finde ich denn Informationen über Visitor, oder Command, oder Decorator? Hab mal bei googel php +Visitor eingeben kam aber nix bei raus.
            daniel-portal.com/games Free Games and more

            Kommentar


            • #7
              Zu 2.
              Wenn du nicht einmal Informationen selbstständig im Netz suchen kannst...
              Du solltest nicht nach einer bestimmten Sprache suchen, sondern nach einer allgemeinen Definition.
              Versuch doch bei Wikipedia dein Glück.

              Zu 1.
              Wieso gibts es register_globals in PHP?

              Kommentar


              • #8


                Wenn das nicht wirklich OOP ist wie macht man es dann OOP?
                http://en.wikipedia.org/wiki/Visitor_pattern
                http://en.wikipedia.org/wiki/Command_pattern
                http://en.wikipedia.org/wiki/Decorator_pattern
                Und warum implentieren die Entwickler eine Funktion wie das überladen wenn es so unsauber ist.
                weil es anwendungsfälle gibt, wo man das brauchen kann.

                Kommentar


                • #9
                  Original geschrieben von Alrik
                  Zu 1.
                  Wieso gibts es register_globals in PHP?
                  php ist halt trotz allem "nur" eine Skriptsprache ...


                  Was mir spontan noch einfallen würde wäre eine Sammlung von extended Klassen, wo man jeweils die includiert, die man braucht. Funktioniert allerdings vernünftig nur unter php5...
                  Beispiel:
                  PHP-Code:
                  function load_module($name) {
                    if (
                  file_exists('./module/' $name '.class.php')) {
                      require_once(
                  './module/' $name '.class.php');
                      return new 
                  $name();
                    } else {
                      throw new 
                  exception('module not found');
                    }
                  }

                  $objekt load_module("forum"); 
                  Damit kriegt man dann automatisch die Klasse geladen die man braucht und wenn man dann noch ein wenig mit extended rumspielt, hat man wunderbares OOP mit geringem runtime code ^^

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar

                  Lädt...
                  X