Warum Getter und Setter verwenden

  • Hey,


    ich lese mich gerade nochmal in die OOP ein und stelle mir die Frage warum empfohlen wird Getter & Setter zu verwenden.


    Ich habe bereits echt viel gegoogelt und es wurde viel erzählt mit der möglichen Datenkapselung, Übersicht des Codes und das man den Code zur Abfrage im Setter/Getter drin hat und dann nicht mehr lang den Code nach der bestimmten Stelle durchsuchen muss.


    Diese Argumente haben mich überhaupt nicht überzeugt und ich bin jetzt genauso schlau wie vorher. Mir ist es nicht klarer geworden warum ich diese nutzen sollte.


    Benutzt ihr Getter & Setter? Wenn ja warum?


    Freue mich von euch zu hören. :-)


    Grüße,

    Stef

  • Getter und Setter geben Dir als Entwickler die Möglichkeit der Validation von Eigenschaften.

    Wenn man public Eigenschaften hat, können die nicht nur direkt gelesen, sondern auch beschrieben werden.

    Deshalb setzt man die Eigenschaft auf private oder protected, je nach Bedarf und Vererbungsfähigkeit. Mit der passenden Setter-Methode kann dann der Wert zunächst validiert werden, bevor dieser der Objektinstanz zugeordnet wird.

    Und da die Eigenschaft nun nicht mehr public ist, nutzt man eine Getter-Methode. Die Getter Methoden haben natürlich auch den zusätzlichen Vorteil, dass die Rückgabe noch bearbeitet, gecastet o.ä. werden kann.

  • Geht mir genau so. Sofern es sich um das reine Setzen und Auslesen einer Variablen handelt, kann ich keinen Nutzen erkennen. Anders sieht es aus, wenn zwingend mit dem Setzen der Variablen weitere Aktionen verbunden sein müssen, z. B. Variable abc setzen erfordert gleichzeitig Aktion x und Aktion y. Dann ist ein Setter durchaus sinnvoll.

  • Hey,


    danke für eure Antworten.


    Zum Verständins:


    Ich habe nun eine Klasse in der z.B. Userdaten verarbeitet werden. Nun habe ich eine weitere Klasse die zum Beispiel die Newsletterverarbeitung ausführt.

    In beiden Klassen habe ich als Eigenschaft die E-Mail. Nun besteht die Gefahr, das diese public E-Mail Variable durch eine Variable von außen überschrieben wird (z.B. wenn man zu 2. etwas programmiert). Aus diesem Grund, das dies nicht auftritt, werden die Eigenschaften je nach dem ob diese Klasse vererbt werden soll oder nicht mit den Keywords protected/private geschützt. Somit kann diese Eigenschaft von außen nurnoch durch Funktionen geändert werden wo es ersichtlicher ist.


    Und die Setter und Getter benutzt man dazu zum Versändnis, dass jeder sofort sieht, dass eine Eigenschaft gesetzt oder diese abgefragt wird und zur Miminierung der Überschreibgefahr.


    Liege ich da so richtig?

  • Etwas spät, aber ... :)


    So in etwa.

    Aber "Überschreibgefahr" nicht. Denn das ist oft gewollt.


    Bsp: ein "Tool"

    Angenommen, das Tool willst Du überschreiben:


    Du hast also mehr Möglichkeiten|Kontrolle.

    Alle, die das Objekt benutzen, müssen die Setter und Getter nutzen, um Values zu setzen|ändern.

    Du weißt also immer, wo die "ankommen" müssen. Und dort kannst Du ansetzen, um etwas zu ändern.

    Wenn alle nur auf die Eigenschaft $object->value = 13 gehen würden, dann könntest Du das gar nicht nachvollziehen.



    BTW: ich hab irgendwo gelesen, dass das eingeführt würde, um Typen (int, string, ...) zu setzen|validieren.

    Mit der nächsten PHP Version solle das nicht mehr nötig sein, da man dann die Eigenschaften per Typ definieren kann.

    Bsp: public int $value; (wenn ich mich nicht irre).

    in dem Artikel hies es, dass Getter und Setter dann ~"endlich ein Ende hätten"~ - find ich aber Quark.

    Getter und Setter sind ja nicht nur zur Validierung. Oft will man einfach noch was anhängen, filtern, loggen, ... .

  • Getter und Setter sind ja nicht nur zur Validierung. Oft will man einfach noch was anhängen, filtern, loggen, ... .

    Korrekt. Ein weiterer Vorteil ist halt, dass man aufgrund von Projektwachstum und -veränderungen Anpassungen auch an Eigenschaften von Objekten hat. In dem Fall müssen maximal nur die Getter und Setter angepasst werden und nicht das Script an sich, dass die Objekt-Instanz verwendet.


    Wer den Nutzen nicht erkennt, sollte sich nochmal mit OOP Grundlagen befassen... Meine Meinung...