[OOP] andere Klasse an aktuelle Klasse anhängen

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

  • [OOP] andere Klasse an aktuelle Klasse anhängen

    Hallo,

    ich steh nen bissel im Moment aufm Schlauch, weil ich folgendes Problem habe:

    Und zwar habe ich eine Layoutklasse, die mit Div Container usw. gefüttert werden soll. So nun habe ich für die Html Sachen eigene Klassen sprich: DivContainer.class.php usw.

    So jetzt würde ich gerne zur Laufzeit, an das Layoutobjekt, die Klassen ranhängen. Beispiel:

    PHP-Code:
    $oLayout = new Layout();
    $oLayout->addDivContainer($parameter); //wir geben eine externe Klasse zurück DivContainer
    $oLayout->getContent(); 
    Geht das überhaupt mit PHP?

    Im Moment sieht das Ganze ungefähr so aus:

    PHP-Code:
    class Layout {
    [....]
    function 
    addDivContainer() {
            
    $this =& new DivContainer($this$this->oDb);
            return 
    $oDiv;
        } 
    [...]
    }

    class 
    DivContainer {
    [...]
        function &
    __construct(&$oHtml, &$oDb) {
            
    $this->oDb =& $oDb;
            
    $this->oRDb =& $oDb;
            
    $this->oWDb =& $oDb;
            
    $this->oHtml =& $oHtml;
        }
    [...]


  • #2
    Ich versteh nich genau was du meinst, aber aus "Klasse an andere Klasse anhängen" schließe ich immer auf Vererbung.

    Falls du das nicht meinst, beschreibe dein Problem bitte etwas genauer für Idioten wie mich.
    Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.

    Kommentar


    • #3
      Original geschrieben von ArSeN
      Ich versteh nich genau was du meinst, aber aus "Klasse an andere Klasse anhängen" schließe ich immer auf Vererbung.

      Falls du das nicht meinst, beschreibe dein Problem bitte etwas genauer für Idioten wie mich.
      Hy,

      ich möchte gerne, dass wenn ich die Methode addDivContainer() aufrufe, die Klasse DivContainer innitialisiert wird und die Methoden, von DivContainer zu Layout gehören. Ungefähr so:

      PHP-Code:
      $oLayout = new Layout();
      $oLayout->addDivContainer();
      $oLayout->addDivStart(); //<-- ist eine Methode aus DivContainer
      $oLayout->addDivEnde(); //<-- ist eine Methode aus DivContainer
      $oLayout->getContent(); //<-- ist eine Methode aus Layout 

      Kommentar


      • #4
        vererbung?

        http://ffm.junetz.de/members/reeg/DS...00000000000000
        mfg

        Kommentar


        • #5
          ich hoffe, dass ich die Problem richtig verstanden habe.
          ich habe dir ein beispiel geschrieben, wie man ein object erweitern kann

          //es ist abhängig von php-version, da die Methoden __call und __get bei
          //älteren Versionen keine Wirkung haben
          PHP-Code:
          class foo{
            var 
          $call;
            var 
          $foomember="foomember";
            function 
          add($object){$this->call=$object;}
            function 
          __get($name){ return isset($this->$name)?$this->$name:$this->call->$name;}
            function 
          __call($funcname,$args){
              if(
          method_exists $this$funcname))
              return 
          call_user_func_array(array(&$this$funcname), $args); 
             return 
          call_user_func_array(array(&$this->call$funcname), $args);
            }
            function 
          mult($a,$b){return $a*$b;}
            
          }
          class 
          probe{
            var 
          $probe="das ist eine Probe";
            function 
          getMember($a,$b){return $this->probe." : ".$a." : ".$b;}
          }

          //TEST
          $pr= new foo;
          $pr->add(new probe());
          echo 
          $pr->mult(2,2)."<br />";
          echo 
          $pr->getMember("mit","parameter")."<br />";
          echo 
          $pr->probe
          du kannst natürlich die Variable call zu einer Liste machen und bei entsprechender anpassung von __call und __get unbegrenzte Erweiterung von Objecten erlauben.
          Eine Problem kann natürlich vorkommen, wenn die Objecte die functionen oder Member mit gleichem Namen haben
          Slava
          bituniverse.com

          Kommentar


          • #6
            Ich steh irgendwie immernoch aufm Schlauch. Wozu soll das ganze denn gut sein?
            Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.

            Kommentar


            • #7
              viel Spass beim Schlauchstehen
              Zuletzt geändert von Slava; 29.09.2006, 16:34.
              Slava
              bituniverse.com

              Kommentar


              • #8
                Danke
                Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.

                Kommentar


                • #9
                  Original geschrieben von ArSeN
                  Ich steh irgendwie immernoch aufm Schlauch. Wozu soll das ganze denn gut sein?
                  Also ich brauch das an sich, um mein SeitenLayout zu bauen, will dazu keine Templateengine nehmen. So und da nen HTML Layout aus mehreren Teilen besteht (in der Regel), Formular, Tabellen, Divs. usw. dachte ich mir, dass ganze in mehrere Klassen zu splitten: DivContainer, FormContainer usw. so und da ich in der Layoutklasse, eine Eigenschaft habe, die das Layout am Ende zusammen baut ($sHtml), wollte ich nicht umbedingt, dass ich die Klassen extra im Skript (index.php) innitialisiere und denn den Kram an die Layoutklasse weitergeben. So ist das ganze auch recht leicht erweiterbar denke ich, weil ich halt durch eine MEthode, auf andere Klassen direkt zugreifen kann. Ob das ganze nun umbedingt sicher ist, weiß ich aber noch net...

                  Achso und Slava, danke werd das gleich mal testen.

                  Kommentar


                  • #10
                    Original geschrieben von ArSeN
                    Danke
                    @ArSeN das war nur ein Witz.
                    Es war einfach komisch
                    @Proggy steht auf dem Schlauch, weil er nicht mehr weiter kommt und du weil du nicht weist wofür das gut sein könnte.

                    Da ich heute auch irgendwie auf dem Schlauch stehe sind wir schon zu dritt
                    Slava
                    bituniverse.com

                    Kommentar


                    • #11
                      Original geschrieben von Slava
                      @ArSeN das war nur ein Witz.
                      Es war einfach komisch
                      @Proggy steht auf dem Schlauch, weil er nicht mehr weiter kommt und du weil du nicht weist wofür das gut sein könnte.

                      Da ich heute auch irgendwie auf dem Schlauch stehe sind wir schon zu dritt
                      Okay Slava, hab die Klasse mal nen bissel erweitert. Reicht fürn Anfang, werd sie noch dahingehend verändern, dass die Klasse meckert, wenn Methoden und Member, mehrmals vorkommen. Kann ich ja denn auch posten.

                      PHP-Code:
                      class ExtendObject{
                          var 
                      $aCall;
                          function 
                      add($oObject){
                              
                      $this->aCall[] = $oObject;
                          }
                          function 
                      __get($sName){
                              if(isset(
                      $this->$sName)) {
                                  return 
                      $this->$sName;
                              }
                              foreach (
                      $this->aCall as $oVal) {
                                  if(isset(
                      $oVal->$sName)) {
                                      return 
                      $oVal->$sName;
                                  }
                              }
                          }
                          function 
                      __call($sFuncname,$aArgs){
                              if(
                      method_exists($this$sFuncname)) {
                                  return 
                      call_user_func_array(array(&$this$sFuncname), $aArgs);
                              }
                              foreach (
                      $this->aCall as $oVal) {
                                  if(
                      method_exists($oVal$sFuncname)){
                                      return 
                      call_user_func_array(array(&$oVal$sFuncname), $aArgs);
                                  }
                              }
                          }

                      Kommentar


                      • #12
                        so direk sehe ich nicht, dass es meckern muss, aber es wird die Methode, die zuerst geschnappt wurde ausgeführt.
                        wenn da aber andere Parameter vorkommen, dann hast du natürlich Pech.

                        Allgemein würde ich dir aber empfehlen mit der Spielerei aufhören und die vorgesehene Vererbungsmechanismen zu benutzen.
                        Slava
                        bituniverse.com

                        Kommentar


                        • #13
                          Machs jetzt doch anders, innitialisiere, die Container, vorher und pack denn, den Htmlkram in die Layoutklasse. Aber kann ja nie schaden, solche Spielereien, in seinem Repo zu haben...

                          Kommentar


                          • #14
                            Hallo,

                            Das was du vorhast lässt sich auch so lösen, wie du es eigentlich wolltest.

                            $oLayout->addDivStart(); //<-- ist eine Methode aus DivContainer
                            $oLayout->addDivEnde(); //<-- ist eine Methode aus DivContainer
                            PHP-Code:
                            class Layout
                            {
                            public function 
                            addDivContainer($container)
                            {
                            $this->container $container;
                            }

                            public function 
                            addDivStart($parameter
                            {
                                
                            $this->container->addDivStart($parameter);
                            }
                            public function 
                            addDivEnde($parameter)
                            {
                               
                            $this->container->addDivEnde($parameter);
                            }

                            public function 
                            getContent()
                            {}

                            Mehr dazu findest du im Decorator-Pattern.

                            Gruß Thomas

                            Kommentar


                            • #15
                              so wird es allgemein gemacht schon aus dem grund, dass viele Programmiersprachen gar nicht anderes können.
                              auf diese weise werden auch in Java die funktionalitäten von den Klassen die keine verwandschaft haben programmiert.
                              PHP bietet so eine Möglichkeit und genau aus diesen Grunden wurden die Methoden __set, __get und __call entwickelt um die überschreibung von Methoden und Eigentschaften von Hand zu sparen.
                              EDIT:
                              zum verdeutlichen mache ich ein Beispiel

                              die Javaentwickler stehen auf seter und geter Methoden, dafür freuen Sie sich, dass eine Programmierumgebung ein Tool zum automatischen erstellen von set und get Methoden erlaubt.
                              über die Reflections API ist es nicht so einfach eine classe um eine dynamische Methode oder eigenschaft zu erweitern.

                              und so kann ich es in PHP machen:
                              PHP-Code:
                              //ich will mir geter und seter sparen
                              //und beliebige variablen zum laufzeit wie in einem array in meiner Classe
                              //zu erstellen

                              class SetGet_ersparen{
                                
                              //ich will dynamisch die variablen erzeugen
                               
                              function __set($name$value){$this->$name=$value;}
                               function 
                              __call($funcname,$args){
                                 
                              //wenn ich diese function habe, dann bekommst du sie auch
                                  
                              if(method_exists $this$funcname))
                                  return 
                              call_user_func_array(array(&$this$funcname), $args);
                                  
                              //das werden geter methoden;
                                  
                              $nam=substr($funcname,3);
                                  if(
                              strpos($funcname,"get")===0){
                                    
                                    if(isset(
                              $this->$nam))return $this->$nam;
                                  }elseif(
                              strpos($funcname,"set")===0){
                                    
                              $this->$nam=$args[0];
                                  }
                                  else return 
                              null;
                               } 
                              }

                              //TEST
                              class Bequem extends SetGet_ersparen{
                               
                              //eine Eigenschaft zum testen
                                
                              var $probevar="locale variable \$probevar";
                              }
                              //los geht's
                              $B=new Bequem;
                              echo 
                              $B->getprobevar()."<br />";
                              $B->erfunden="erfunden";
                              echo 
                              $B->geterfunden()."<br />";
                              $B->setIrgendwas("ich bin irgendwas");
                              echo 
                              $B->Irgendwas
                              Zuletzt geändert von Slava; 30.09.2006, 22:25.
                              Slava
                              bituniverse.com

                              Kommentar

                              Lädt...
                              X