Ankündigung

Einklappen
Keine Ankündigung bisher.

Implementierung vieler Getter bzw. Setter-Methoden

Einklappen

Neue Werbung 2019

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

  • Implementierung vieler Getter bzw. Setter-Methoden

    Hallo,

    mitunter enthält eine Klasse ja sehr viele Eigenschaften.
    Benutzt man die magischen Mehoden __set bzw. __get, muss man nicht für jeder Eigenschaft eine Methode schreiben. Jedoch kann man dann auch die jeweiligen Werte nicht mehr beeinflussen (evtl. möchte ich ja einen Wert in der Setter-Methode prüfen). Bei 20 Eigenschaften hat man jeweils 20 Getter und 20 Setter.

    Ausserdem soll verhindert werden, das man direkt auf eine Variable von aussen zugreifen kann. Das geht meines Wissens ja sowieso nur mit einem Getter / Setter und nicht mit magischen Methoden

    Was ist hier ein guter Weg? Für jede Eigenschaft einen Setter / Getter oder gibts auch einen Weg, der die Vorteile von beiden Varianten verbinden kann?


  • #2
    Zitat von axelf Beitrag anzeigen
    Benutzt man die magischen Mehoden __set bzw. __get, muss man nicht für jeder Eigenschaft eine Methode schreiben. Jedoch kann man dann auch die jeweiligen Werte nicht mehr beeinflussen (evtl. möchte ich ja einen Wert in der Setter-Methode prüfen).
    Sowohl __get als auch __set bekommen den Namen der Property übergeben.
    Daran, per switch o.ä. für einige oder auch alle Properties, die darüber angesprochen werden, eine Sonderbehandlung zu implementieren, hindert dich also niemand.

    Ausserdem soll verhindert werden, das man direkt auf eine Variable von aussen zugreifen kann. Das geht meines Wissens ja sowieso nur mit einem Getter / Setter und nicht mit magischen Methoden
    Auch daran, eine Exception zu schmeißen, wenn dir der Zugriff nicht passt, hindert dich niemand.

    Kommentar


    • #3
      Hi,

      also ist es letztlich die persönliche Entscheidung wie man sowas löst?
      Die switch-Anweisung würde ja mitunter auch sehr groß werden.

      Was ist denn besserer Stil? Die Verwendung der magischen Methoden oder das alles selbst zu schreiben?

      Kommentar


      • #4
        Diese magischen Methoden kommen sowieso nur zum Zug, wenn die Sichtbarkeit den direkten Zugriff nicht erlaubt.

        Getter und Setter nur zum „Durchreichen“ zu nutzen, ist Unsinn. Wenn keinerlei Kontrolle erforderlich ist - dann wählt man public als Sichtbarkeit, und gut.

        Bei den Eigenschaften, die aber aus gutem Grund private oder protected deklariert sind, wirst du dir aber sicher auch etwas dabei gedacht haben. Dass die dann jeweils eigene explizite Getter/Setter haben, wenn erforderlich, da spricht m.E. nichts gegen.
        Wenn die magischen Methoden also nur aus „Faulheit“ exzessiv genutzt werden - dann sollte erst mal das Sichtbarkeits-Konzept der Eigenschaften überdacht werden.

        Kommentar


        • #5
          Zitat von ChrisB Beitrag anzeigen
          Getter und Setter nur zum „Durchreichen“ zu nutzen, ist Unsinn. Wenn keinerlei Kontrolle erforderlich ist - dann wählt man public als Sichtbarkeit, und gut.
          Insbesondere wenn sich Überprüfungen später doch als notwendig erweisen, leisten magische Methoden gute Dienste.

          Vorher:
          PHP-Code:
          class Foo {
            public 
          $Bar;

          Nachher:
          PHP-Code:
          class Foo {
            public function 
          __set($name$value) {
              switch (
          $name) {
                case 
          'Bar':
                  if (
          is_int($value)) $this->bar $value; else throw new Exception('Integer expected');
                  break;
              }
            }
            public function 
          __get($name) {
              switch (
          $name) {
                case 
          'Bar':
                  return 
          $this->bar;
              }
            }
            private 
          $bar;

          Beide Klassen sehen von außen betrachtet gleich aus.
          Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

          Kommentar


          • #6
            Hi,

            danke erstmal für die Antworten.
            Ich hätte hier:

            Zitat von mimomamu Beitrag anzeigen
            PHP-Code:
            class Foo {
              public function 
            __set($name$value) {
                switch (
            $name) {
                  case 
            'Bar':
                    if (
            is_int($value)) $this->bar $value; else throw new Exception('Integer expected');
                    break;
                }
              }
              public function 
            __get($name) {
                switch (
            $name) {
                  case 
            'Bar':
                    return 
            $this->bar;
                }
              }
              private 
            $bar;

            wohl sowas geschrieben:

            PHP-Code:
            public function setBar($value){
              if (
            is_int($value)){
                
            $this->bar $value
              }else {
                throw new 
            Exception('Integer expected');
              }
            }

            public function 
            getBar(){
                return 
            $this->bar;

            Aber hier wurde ja schon gesagt, das es immer auf den jeweiligen Fall ankommt.

            Eine Frage noch:
            Wie kann man denn eigene Getter / Setter und die magischen Methoden mischen? also wenn ich für manche Variablen die magische Methode benutzen will und für andere eigene Methoden? Reicht es dann aus einfach die Sichtbarkeit von public auf private / protected zu setzen?

            Kommentar


            • #7
              Faulheit sollte kein Argument sein, schlechten Programmierstil anzuwenden. Du kannst wunderbar mit einem kleinen Codegenerator die Methoden generieren.
              "Mein Name ist Lohse, ich kaufe hier ein."

              Kommentar


              • #8
                Zitat von axelf Beitrag anzeigen
                Reicht es dann aus einfach die Sichtbarkeit von public auf private / protected zu setzen?
                Nein.

                Kommentar


                • #9
                  Zitat von Chriz Beitrag anzeigen
                  Faulheit sollte kein Argument sein, schlechten Programmierstil anzuwenden. Du kannst wunderbar mit einem kleinen Codegenerator die Methoden generieren.
                  Hatte ich bisher auch immer so gemacht, bzw. geht das über die IDE (Netbeans). Der generiert aus den Eigenschaften die jeweiligen getter und setter.

                  Kommentar


                  • #10
                    Wie kann man denn eigene Getter / Setter und die magischen Methoden mischen?
                    Du könntest __call verwenden:

                    PHP-Code:
                    class Foo {
                        protected 
                    $_properties = array(
                            
                    'date' => 0,
                            
                    'name' => '',
                            
                    'active' => false,
                            
                    'counter' => 0
                        
                    );
                        
                        public function 
                    __call($name$arguments)
                        {
                            switch (
                    substr($name03)) {
                                case 
                    "set":
                                    
                    $name lcfirst(substr($name3));
                                    if (
                    array_key_exists($name$this->_properties)) {
                                        
                    $this->_properties[$name] = $arguments[0];
                                    } else {
                                        throw new 
                    Exception("Unknown property '" $name "'");
                                    }
                                    break;
                                    
                                case 
                    "get":
                                    
                    $name lcfirst(substr($name3));        
                                    if (
                    array_key_exists($name$this->_properties)) {
                                        return 
                    $this->_properties[$name];
                                    }
                                    return 
                    null;
                                    break;
                                    
                                default:
                                    if(
                    method_exists($this$name)) {
                                        
                    call_user_func_array($this->$name(), $arguments);
                                    } else {
                                        throw new 
                    Exception("Unknown method '" $name "'");
                                    }
                            }
                        }
                        
                        public function 
                    setCounter($value)
                        {
                            if (
                    $value 0) {
                                
                    $value 0;
                            }
                            
                            if (
                    $value 10) {
                                
                    $value 10;
                            }
                            
                            
                    $this->_options['counter'] = $value;
                        }
                    }

                    /*
                    $bar = new Foo();
                    $bar->setName('Heinz');
                    $bar->setCounter(15);
                    $bar->setHugo(2); // -> Exception "unknown property"
                    $bar->michtGibtsNicht(); // -> Exception "unknown method"
                    echo "\n";
                    echo "Name: " . $bar->getName() . "\n";
                    echo "Counter: ". $bar->getCounter() . "\n";
                    */ 
                    Grüße.

                    Kommentar


                    • #11
                      Getter und Setter nur zum „Durchreichen“ zu nutzen, ist Unsinn.
                      Mit Verlaub - das ist Unsinn. Getter und Setter dienen zur Definition des Objektinterface. Da Interfaces nur durch Methoden, nicht durch Properties bestimmt werden, gibt es keine andere Lösung (übrigens auch nicht die Variante via __call, obwohl ich die sonst nen guten Kompromiss finde). Sonst hätte die Dinger wohl auch niemand erfunden.

                      PHP-Code:
                                      if(method_exists($this$name)) {
                                          
                      call_user_func_array($this->$name(), $arguments);
                                      } else {
                                          throw new 
                      Exception("Unknown method '" $name "'");
                                      } 
                      Der Teil ist glaube ich Quark. Vor __call wird ja schon geprüft, ob eine benamte Methode existiert. Und __call wird nur aufgerufen, wenn nicht.
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar


                      • #12
                        Zitat von nikosch Beitrag anzeigen
                        Mit Verlaub - das ist Unsinn. Getter und Setter dienen zur Definition des Objektinterface.
                        Dafür brauchst du aber explizite Getter und Setter - die magischen definieren das Objektinterface kein bisschen mehr, als Properties.

                        Kommentar


                        • #13
                          Zitat von nikosch Beitrag anzeigen
                          Der Teil ist glaube ich Quark. Vor __call wird ja schon geprüft, ob eine benamte Methode existiert. Und __call wird nur aufgerufen, wenn nicht.
                          Hast recht. Reicht hier die Exception zu werfen.

                          Grüße.

                          Kommentar


                          • #14
                            - die magischen definieren das Objektinterface kein bisschen mehr, als Properties.
                            DAS habe ich auch geschrieben: "übrigens auch nicht die Variante via __call"
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar


                            • #15
                              Hast recht. Reicht hier die Exception zu werfen.
                              Ich werf bei sowas eine BadMethodCallException.
                              I like cooking my family and my pets.
                              Use commas. Don't be a psycho.
                              Blog - CoverflowJS

                              Kommentar

                              Lädt...
                              X