getter und Setter erklärung gesucht

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

  • getter und Setter erklärung gesucht

    Hallo Leute, versuche grade php zu lernen.

    kann mir jemand erklären was sind __get() und __set() methoden?
    Also meine Recherche ergab:
    Es gibt 2 Arten von get/set Methoden.
    1)kann man selber schreiben
    2) und die 2te muss man die bestehenden verwenden. __get() __set()

    Nur kann ich bei keinem der beiden einen Mehrwert erkennen für was die gut sein sollte?
    Kann mir das jemand erklären für was die gut sein sollte?

    Oder einen Link auf eine Info Quelle die das gut erklärt? Mit einem guten Beispiel ?

    Vielen `Dank im Voraus.

  • #2
    Hatte dazu mal was gebloggt: It’s magic: Magische Methoden in PHP | Der PHP Hacker — Noch ein PHP Blog
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #3
      Vielen dank für den Link.

      Bin schwer von Begriff: z.B. die __set() Methode wird gebraucht wenn etwas Dynamisch geladen wird. Bzw. wenn eine Classe Dynamisch um einige Eigenschaften erweitert wird.
      Aber bei welchen Szenarien Trifft das z.B. zu?
      Hab versucht hier was zu schreiben leider verschte ich nicht wie es funktioniert bzw. wozu __set() da ist.
      PHP-Code:
      <?php
      /* 
       * To change this template, choose Tools | Templates
       * and open the template in the editor.
       */

      /**
       * Description of getSet
       *
       * @author Administrator
       */
      class Webseite{


          public 
      $pagerank;
          public 
      $alexa;
          public 
      $archive;

          
      // die muss ich implementieren ? 
          
      public  $nichtbekannt;

          public function 
      __construct($pagerank,$alexa,$archive){

              
      $this->pagerank $pagerank;
              
      $this->alexa    $alexa;
              
      $this->archive  $archive;

          }

              public function 
      __set($eigenschaft,$value){



              
      $this->nichtbekannt $value;
             
              }
              
              
      // was ich nicht verstehen kann hier kommt nichts ? 
              // warum nichts ? 

      }


      $meineSeite = new Webseite('4','6905','2005');

      $meineSeite->sichtindex ='23'// versuche eine Variable/Eigenschaft zuweisen die es nicht gibt 
      print "was habe ich hier uebergeben ?\n ";
      print 
      "--: {$meineSeite->alexa}\n";
      print 
      "--:{$meineSeite->pagerank}\n";
      print 
      "--:{$meineSeite->archive}\n";
      print 
      "--:{$meineSeite->sichtindex}\n"// Versuche diese hier auszugeben leider nein, und ich wiss nicht warum ? 


      ?>
      kann mir jemand helfen die get und set variablen zu verstehen helfen ?

      danke im Voraus.

      Kommentar


      • #4
        Meines Erachtens macht die Verwendung von __set und __get wenig/selten Sinn.
        1. lassen sie sich schlecht dokumentieren
        2. Die Autovervollständigung der großen Editoren bleiben auf der Strecke
        Also, wann machts Sinn?
        Nur dann, wenn man die gewünschten Eigenschaften der Klasse nicht kennt, wärend man die Klasse schreibt.
        Das ist z.B. der Fall, wenn man das Registry oder Dependency Injection Pattern implementiert. Oder evtl. auch in einem ORM.
        Zuletzt geändert von combie; 19.08.2009, 20:39.
        Wir werden alle sterben

        Kommentar


        • #5
          Magische Getter und Setter können in Basisklassen sicher stellen, dass Ableitungen bestimmte Methoden implementieren oder sonst einheitliche Fehler geworfen werden. Bestimmte Methoden heißt in diesem Fall eben Getter und Setter für die Membervariablen, die in der Ableitung definiert sind.

          Kommentar


          • #6
            PHP-Code:
            <?php
            error_reporting
            (-1);
            ini_set('display_errors'TRUE);
             

            class 
            Webseite
            {

                protected 
            $pagerank;
                protected 
            $alexa;
                protected 
            $archive;
                protected 
            $nichtbekannt = array(); // ein Container für user Eigenschaften

                
            public function __construct($pagerank,$alexa,$archive)
                {
                    
            $this->pagerank $pagerank;
                    
            $this->alexa    $alexa;
                    
            $this->archive  $archive;
                }

                public function 
            __set($eigenschaft,$value)
                {
                  
            $this->nichtbekannt[$eigenschaft] = $value;
                }
                
                public function 
            __get($eigenschaft)
                {
                  if(!isset(
            $this->nichtbekannt[$eigenschaft])) // null gilt als nicht gesetzt
                    
            throw new Exception("Die Eigenschaft $eigenschaft ist nicht gesetzt");
                  return 
            $this->nichtbekannt[$eigenschaft];
                }
            }


            $meineSeite = new Webseite('4','6905','2005');

            $meineSeite->sichtindex ='23'// versuche eine Variable/Eigenschaft zuweisen die es nicht gibt
            print "was habe ich hier uebergeben ?<br>\n ";
            print 
            "--:{$meineSeite->alexa}<br>\n";
            print 
            "--:{$meineSeite->pagerank}<br>\n";
            print 
            "--:{$meineSeite->archive}<br>\n";
            print 
            "--:{$meineSeite->sichtindex}<br>\n"// Versuche diese hier auszugeben und tuts!
            print "--:{$meineSeite->traritratra}<br>\n"// wirft Exception!




            ?>
            Zuletzt geändert von combie; 19.08.2009, 23:50.
            Wir werden alle sterben

            Kommentar


            • #7
              Vielen Dank für die Antworten die es hier gegeben hat.
              Leider ist es für mich immer noch nicht verständlich.

              Der Code von combie hat einen Fehler, gemeint ist nicht die Exception.

              @combie die Aussage von Oben habe ich schon mal gelesen, in einem Anderen Forum. ;-)


              @onemorenerd = nicht falsch verstehen -> Leider ist die Antwort für mich viel zu schlau. erhlich ich habe nur ein teil verstanden.
              kannst du eine Reelle Anwendungs-Möglichkeit geben ?


              Da ich immer noch da bin wo ich war. Alleine die aussage von Combie hat etwas Licht in dunkelheit gebracht
              Meines Erachtens macht die Verwendung von __set und __get wenig/selten Sinn.
              Nur dann, wenn man die gewünschten Eigenschaften der Klasse nicht kennt, während man die Klasse schreibt.
              wie kann ich eine Klasse Schreiben die ich nicht kenne ? Absurd !

              Wo ist hier bei der __get() und __set() Methode die Logik?!

              Der Code von Unten kommt ( fast genau so wie er ist ) aus dem PHP Pear Buch von Carsten Möhrke!
              ( Modifiziert durch mich ) Zahl eingebracht und die ausgabe mit print_r verdeutlicht.
              PHP-Code:
              <?php

              class Setter {

               private 
              $data;

                  public function  
              __set($name,  $value) {

                      
              $value $value +5;
                      
              $this->data[$name]=$value;
                  }

                  public function 
              __get($name){

                      return 
              $this->data[$name];
                  }
              }


              $meinObject = new Setter();

              $meinObject->eigenschaft'10';

              echo 
              $meinObject->eigenschaft;

              print_r($meinObject);
              ?>
              Der Code Spukt folgendes aus.
              PHP-Code:
              15Setter Object ( [data:rivate] => Array ( [eigenschaft] => 15 ) ) 
              Die Addition habe ich eingebracht um zu sehen ob die Funktion auch in Gebrauch genommen wird.
              Und wie man sehen kann Sie wird gebraucht.

              Aber der Code hier :
              PHP-Code:
              <?php

              class Setter {


                  private 
              $data;


              }


              $meinObject = new Setter();

              $meinObject->eigenschaft'10';

              echo 
              $meinObject->eigenschaft;

              print_r($meinObject);
              ?>
              Gibt folgendes aus:
              PHP-Code:
              10Setter Object ( [data:rivate] => [eigenschaft] => 10 
              Sprich das Objekt hat auch die Eigenschaft die ich nicht deklariert habe ?
              Wozu dann die __set() und __get()
              Was habe ich falsch verstanden?

              Bitte um Hilfe !

              Kommentar


              • #8
                Ok, dann versuch ich es nochmal. Magische Getter und Setter bieten ein paar relevante Vorteile, die man zwar nie dringend braucht, die aber das Programmieren netter machen können. Dennoch haben sie auch Nachteile (wie bereits erwähnt).

                Zitat von Apfelmus Beitrag anzeigen
                wie kann ich eine Klasse Schreiben die ich nicht kenne ? Absurd !
                Siehe Punkt 3.

                1. Man kann sie einfach ansprechen, als wären es öffentliche Membervariablen. Statt $objekt->getSonstwas() schreibt man einfach $objekt->sonstwas.
                2. Man kann Getter ohne zugehörige Setter implementieren, was den einzigen Weg darstellt, in PHP schreibgeschützte Properties umzusetzen.
                3. Man kann sie sozusagen zur Laufzeit erzeugen. Das macht z. B. Sinn, wenn man Datenformate mit einer Klasse abbilden will, deren Eigenschaften nicht von vornherein feststehen. Z. B. INI-Dateien. Eine Klasse kann in so einem magischen Getter entscheiden, ob es in der INI-Datei eine Eigenschaft dieses Namens gibt und im Erfolgsfall den Wert zurückliefern. Mit normalen Membervariablen ließe sich das nur lösen, wenn die INI-Datei ein ganz bestimmtes Format besitzt, das immer die gleichen Eigenschaften enthält.
                4. Wenn man mit Exceptions arbeitet, kann man beim unerlaubten Zugriff auf magische Eigenschaften selbige werfen. Der Zugriff auf private oder gar nicht vorhandene Membervariablen dagegen erzeugt nur PHP Errors/Warnings, die man erst mit benutzerdefinierten Errorhandlers wieder zu Exceptions machen müsste.

                Ohne magische Getter und Setter entstehen Methoden wie getProperty($pName) und setProperty($pName, $pValue). In diesem Punkt muss ich combie widersprechen. Für Dokumentation und Autovervollständigung haben magische Getter und Setter in diesem Fall keine entscheidenden Nachteile, denn die Alternative (getProperty und setProperty) würde auch nichts über die verfügbaren Eigenschaften aussagen.

                Bei Fragen, fragen.

                Gruß,

                Anja
                Zuletzt geändert von AmicaNoctis; 21.08.2009, 23:49.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Für solche Array-Wrapper sind die Dinger ziemlich banal. Guck dir für eine recht interessante doch mal das Feed-Package im Zend Framework an. Da wird viel mit den magischen Methoden gearbeitet, um auf Attribute und Inhalte zuzugreifen. Ob man das umbedingt so machen sollte ist eine andere Frage, aber da sieht du etwas mehr implementation.

                  Kommentar


                  • #10
                    OffTopic:
                    Off-topic abgetrennt - wer's weiterführen möchte, bitte hier entlang: http://www.php-resource.de/forum/out...ch-boerse.html :-)
                    Hier jetzt bitte wieder on-topic diskutieren, Danke.
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Zitat von AmicaNoctis Beitrag anzeigen
                      ... In diesem Punkt muss ich combie widersprechen. Für Dokumentation und Autovervollständigung haben magische Getter und Setter in diesem Fall keine entscheidenden Nachteile, denn die Alternative (getProperty und setProperty) würde auch nichts über die verfügbaren Eigenschaften aussagen.
                      Wenn die vom Prinzip her anonymen Getter und Setter Methoden keinen Nachteil haben, hätten die gängigen IDE's wohl kaum so viele Probleme damit solche Properties in Autovervollständigungs Funktionen zu berücksichtigen.

                      Das ZendEngine Entwicklerteam geht leider nicht sehr häufig den guten und vernünfigen weg. Aus diesem Grunde ist PHP eben etwas defizitärer als andere Sprachen. (siehe auch fehlenden finally Block bei Exceptions.)

                      Ich hätte seinerzeit einen Ansatz wie bei Delphi bevorzugt ... weil man dort zum einen eine Aussage über das Property (Für IDE's) als auch eine schönere vom OO Paradigma geforderte Kapselung erreicht hätte ... aber wer hört schon auf mich ... .
                      carpe noctem

                      [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                      [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                      Kommentar


                      • #12
                        Super ! danke! Auch wenn es nicht logisch ist!

                        ich glaube ich muss von anfang das verstehen bzw. ich kapiere es nicht!


                        1. Man kann sie einfach ansprechen, als wären es öffentliche Membervariablen. Statt $objekt->getSonstwas() schreibt man einfach $objekt->sonstwas.
                        2. Man kann Getter ohne zugehörige Setter implementieren, was den einzigen Weg darstellt, in PHP schreibgeschützte Properties umzusetzen.

                        Das kann ich auch so !
                        PHP-Code:
                        <?php

                        class Setter {


                            private 
                        $data;


                        }


                        $meinObject = new Setter();

                        $meinObject->eigenschaft'10';

                        echo 
                        $meinObject->eigenschaft;

                        print_r($meinObject);
                        ?>
                        Das geht doch? ein Objekt hat die Eigenschaft (Eigenschaft) mit dem Wert 10 !
                        Und das ohne get() und set() ?


                        Grundlegend verstehe ich nicht folgendes!

                        die Funktion hier Zend Framework: Documentation ist Statisch also sind get und Set überflüssig?

                        die Eigenschaft [COLOR=#000000]myUpdated ist Statisch!

                        wenn es Dynamisch wäre dann würde ich set und get als Nutzlich einsehen!

                        was übersehe ich -> ich muss was übersehen nur kapiere ich nicht was ?




                        [/COLOR]

                        Kommentar


                        • #13
                          Zitat von Apfelmus Beitrag anzeigen
                          Das geht doch? ein Objekt hat die Eigenschaft (Eigenschaft) mit dem Wert 10 !
                          Und das ohne get() und set() ?
                          Du hast in dem, was du davor zitiert hast, das "als wären es öffentliche Membervariablen" überlesen.
                          I don't believe in rebirth. Actually, I never did in my whole lives.

                          Kommentar


                          • #14
                            ich glaube ich übersehe ich was richtig banales !

                            den wie ich geschrieben habe kann ich auch ohne get und set auskommen.

                            also sind die Überflüsig?

                            kann niemand ein Beispiel geben welcher einfach und Logisch ist ?

                            Kommentar


                            • #15
                              Zitat von Apfelmus Beitrag anzeigen
                              den wie ich geschrieben habe kann ich auch ohne get und set auskommen.
                              Ja - bei Membern, die public, öffentlich sind.

                              Und wie sieht das jetzt aus, wenn du die Membervariable als privat deklarierst ...?
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X