Ankündigung

Einklappen
Keine Ankündigung bisher.

Methodenaufruf im Konstruktor

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

  • Methodenaufruf im Konstruktor

    Hallo Community,

    ich hoffe ihr könnt mir da bei etwas helfen: ich versuche von einer Klasse eine Variable an eine andere zu übergeben, ohne diese als Argument beim Klassenaufruf zu übergeben, sondern, diese innerhalb des Konstruktors der anderen Klasse aus der ersten rauszuziehen.

    Konkret:

    in Klasse eins hat der User die Möglichkeit eine Variable anzugeben.

    PHP-Code:
    class Klasse_eins {
        public 
    $var;

        public function 
    __construct($var) {
            
    $this->var$var;
        }
        public function 
    getVar() {
            return 
    $this->var;
        }
    }

    $eins = new Klasse_eins('text');
    echo 
    $eins
    Diese Variable soll in Klasse zwei gültig sein:

    PHP-Code:
    class Klasse_zwei extends Klasse_eins {
        public function 
    __construct($var Klasse_eins::getVar()) {
        
    $this->variable $var;
        }
    }

    $zwei = new Klasse_zwei();
    echo 
    $zwei
    Auf die Art klappt das leider nicht, aber ich denk mal, es ist klar, WAS ich eigentlich erreichen möchte... kann mir da jmd einen Tipp geben?


  • #2
    Einfach den Constructor in Klasse_zwei weg lassen.

    Kommentar


    • #3
      wäre eine Möglichkeit, ja...da das Obenstehende aber nur ein Beispiel und auf das Nötigste reduziert war, ist mir das leider nicht möglich. Ich hab noch viel mehr Argumente, die ich übergebe und deswegen kann ich auf den Konstruktor leider nicht verzichten,

      Kommentar


      • #4
        Dein Beispiel ergibt so wie ich das verstehe keinen Sinn, weil du Klassen mit Objekten verwechselst. "extends" heisst ja nur es ist vom gleichen Typ, aber nicht das selbe Objekt. Wenn ich mehrere Klasse_eins Objekte habe, von welchem soll Klasse_zwei denn dann die Daten holen? Du musst die Instanz von Klasse_eins dann an Klasse_zwei übergeben und die Daten übernehmen lassen.

        Und "echo $zwei;" ist halt auch Quatsch, so lange du nicht __toString implementierst sollte das eine Fehlermeldung geben. Sich hier auf Pseudocode zu beziehen ist denke ich kontraproduktiv, beschreib doch erst mal dein Problem und warum du das gerade so lösen willst.
        You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.

        Kommentar


        • #5
          Zitat von strobi80 Beitrag anzeigen
          Ich hab noch viel mehr Argumente, die ich übergebe und deswegen kann ich auf den Konstruktor leider nicht verzichten,
          Hast du für Klasse_zwei mehr Argumente im Konstruktor als für Klasse_eins und musst einen Teil davon an Klasse_eins übergeben?

          PHP-Klassen auf github

          Kommentar


          • #6
            Zitat von strobi80 Beitrag anzeigen
            wäre eine Möglichkeit, ja...da das Obenstehende aber nur ein Beispiel und auf das Nötigste reduziert war, ist mir das leider nicht möglich. Ich hab noch viel mehr Argumente, die ich übergebe und deswegen kann ich auf den Konstruktor leider nicht verzichten,
            Dann solltest du ein brauchbares Beispiel zeigen.

            Kommentar


            • #7
              Wenn du konkrete Daten aus einen Objekt der Klasse_eins in der Klasse_zwei benötigst, ist Vererbung (extends) der falsche Weg. Du kannst dann das Objekt im Konstruktor übergeben (Stichwort DI):
              PHP-Code:
              $ObjEins = new Klasse_eins('text');

              $ObjZwei = new Klasse_zwei($ObjEins); 
              Ist es das was du suchst?
              PHP-Klassen auf github

              Kommentar


              • #8
                danke für eure anregungen, ich versuchs jetzt mal ohne pseudocode:

                vom prinzip her sieht das folgendermaßen aus:

                in meiner Klasse "site" wird das Grundgerüst einer html-Seite aufgebaut. In einer weiteren Klasse "schalter" wird ein Elemente erzeugt, das der html-Seite hinzugefügt werden.

                PHP-Code:
                class site {
                    public 
                $controller;
                    private 
                $html '';
                    private 
                $headline;
                    private 
                $elements = array();

                    public function 
                __construct($headline$controller) {
                        
                $this->headline $headline;
                        
                $this->controller $controller;
                    }
                    public function 
                getHeadline() {
                        return 
                $this->headline;
                    }
                     public function 
                getController() {
                         return 
                $this->controller;
                     }
                    public function 
                add_element ($element){
                        
                array_push($this->elements$element);
                    }
                    public function 
                generateHTML() {
                        
                $html ='
                            <div id="'
                .$this->headline.'" class="center"></div>';

                        foreach (
                $this->elements as $element) {
                            
                $html .= $element->generateHTML();
                        }

                        return 
                $html;
                    }
                }        


                class 
                schalter extends rltSite {
                    public function 
                __construct($stages stages::Anlagenschalter_EIN_AUS) {
                        
                $this->stages $stages;    
                        
                $this->controller $rltSite->getController();

                        public function 
                generateHTML() {
                        
                $this->stages = ($this->stages == stages::Anlagenschalter_2Stufen)?('twostages'):('');

                        
                $html '<div id="plantmode" class="'.$this->stages.'">
                                <h3>Anlagenstatus</h3>
                                <h3>Anlagenschalter</h3>
                                <h3>'
                .$this->controller.'</h3>
                                <span class="ps-button btn">Handbedienung</span>
                                <br />
                                <span class="ps-button btn">vor-Ort Bedienung</span>'
                ;
                        
                $html .='</div>';
                        return 
                $html;
                    }

                Die Klasse Schalter ist nur EIN Beispiel für ein solches Element. Es gibt verschiedene Elemente, die alle wie oben in separaten Klassen definiert sind. Alle müssen aber dieselbe Variable controller haben.

                Der Aufruf läuft dann folgendermaßen:

                PHP-Code:
                $site = new site('Beispielanlage''controller_AX0000_3473465__');
                $schalter = new schalter();
                $site->add_element($schalter);

                echo 
                $site->generateHTML(); 
                natürlich könnte ich auch beim Instanziieren jedes neuen Elements die controllervariable mit übergeben, aber ich würd gerne wissen, wie es generell zu bewerkstelligen wäre, eine Vaiable aus einer Klasse an eine andere zu übergeben.

                Kommentar


                • #9
                  PHP-Code:
                  public function __construct($var) {
                      
                  parent::__construct($var);

                  Signaturrrrrrr

                  Kommentar


                  • #10
                    Vererbung(*) ist hier der falsche Weg!
                    Mit einer Vererbung würdest du beim Instanziieren jedes neuen Elements auch ein neues site-objekt erzeugen. Ist nicht das Ziel denke ich.#7 zeigt den Weg.

                    Angedeutet:
                    PHP-Code:
                    class schalter {
                        public function 
                    __construct($rltSite$stages stages::Anlagenschalter_EIN_AUS) {
                            
                    $this->stages $stages;    
                            
                    $this->controller $rltSite->getController();
                        }
                        
                    // :

                    Edit:
                    PHP Vererbung mit extends
                    Hier wird kein Objekt/ keine Instanz vererbt, sondern nur die Klasse bzw. der Bauplan.
                    Vereinfacht kann man sich dies so vorstellen, das mit extends Klassname der gesamte Code von Klassname gewissermaßen als Basis in die Unterklasse eingefügt wird.
                    Der Vergleich hinkt, da die Sichtbarkeiten außer auch gelassen wurden.
                    PHP-Klassen auf github

                    Kommentar


                    • #11
                      PHP-Code:
                      class site { ... 
                      PHP-Code:
                      class schalter extends rltSite {... 
                      Die klasse rltSite gibt es in deinem hier gezeigten Code nicht!

                      PHP-Code:
                      $this->stages = ($this->stages == stages::Anlagenschalter_2Stufen)?('twostages'):(''); 
                      Was ist das bitte fuer ein Mist?
                      Warum die Klammern nach dem ? und dem : ? Die sind da total unnoetig!

                      PHP-Code:
                      $html '<div id="plantmode" class="'.$this->stages.'"> ... 
                      Jedesmal wenn du einen neuen Schalter erstellst und diesem via "addElement" hinzufuegst, erstellst ein weiteres Element mit einer ID, die schon existiert!

                      Weiter habe ich jetzt nicht gelesen, da der ganze Code eigentlich Muell ist.

                      jspit hat schon angedeuted wie man es machen kann.

                      Kommentar


                      • #12
                        Und:

                        PHP-Code:
                        class schalter extends rltSite 
                        Vererbung ist ein "ist ein(e)" Verhältnis. Mann ist ein Mensch, Mensch ist ein Lebewesen, BMW ist ein Auto, VW ist ein Auto, Auto ist ein Kraftfahrzeug, etc.

                        Bei dir ist ein schalter sicher keine rltSite, oder? Daher ist es der falsche Weg, wie auch oben schon erwähnt.
                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar

                        Lädt...
                        X