Aloha ;)
den Sinn von
get()
kann ich nachvollziehen. Man möchte eine Eigenschaft von außen abfragen können, sie soll aber nicht von außen zu ändern sein.Die Kombination von
get()
undset()
verstehe ich aber nicht wirklich. Man kann doch im Konstruktor einer Klasse eine Eigenschaft festlegen, welche man ebenfalls von außen lesen/ändern kann.Warum dann
get()
undset()
verwenden?
Dir entgeht da noch etwas wichtiges: Möglichkeiten, einzugreifen!
Solange dein getter nur den Wert zurückliefert und dein setter nur den Wert setzt, der übergeben wird, kein Thema - in diesem Szenario kann man gut auf getter und setter verzichten (außer, wie du selbst sagtest, im Readonly-Fall.
Jetzt, was könnte es sein, warum du eine Möglichkeit zum Eingreifen haben möchtest - alles natürlich hypothetisch, aber ist mir alles schonmal passiert.
Ein paar Beispiele für den getter:
- du möchtest Zugriffe auf die Eigenschaft loggen
- du möchtest nicht exakt das liefern, was tatsächlich im Objekt gespeichert ist, sondern etwas davon abgeleitetes (Bsp.: Du speicherst eine ID, lieferst ein Objekt)
- du möchtest vor dem Ausliefern des Wertes erstmal noch schnell prüfen, ob er noch plausibel ist
- du initialisierst nur Teile deines Objekts direkt und alle anderen erst "bei Bedarf" - z.B. beim Zugriff via get
Ein paar Beispiele für den setter:
- du möchtest den zu setzenden Wert auf Plausibilität prüfen ("hier kommen nur positive Zahlen rein")
- du möchtest die Veränderung mitloggen ("changelog")
- du möchtest je nach Wert der Variable andere Objekte/Eigenschaften/... mitverändern
- du möchtest statt eines übergebenen Objekts nur dessen ID speichern
- ...
Natürlich kann man all diese Dinge auch innerhalb der sonstigen Prozeduren tun - aber kommt dann eben ganz schnell in den Bereich DRY - don't repeat yourself.
Statt 20 Mal eine Log-Anweisung zu schreiben, weil du gerade einen Wert abgerufen hast, kannst du das auch genau einmal tun und in Zukunft den Wert über den Getter aufrufen.
Ich hoffe die Beispiele waren soweit verständlich...
Grüße,
RIDER
P.S.: Ein gut gemeinter Tipp: Gerade am Anfang denkt man: Ach was, das brauch ich ja nicht, geht schon auch so. Meine Erfahrung sagt mir, dass ich kaum ein Projekt zusammenprogrammiert habe, bei dem ich nicht entweder irgendwann wirklich froh war, getter und setter zu verwenden oder mir irgendwann wirklich in den Arsch gebissen habe, weil ich keine getter und setter verwendet hatte... Projekte wachsen oft mit der Zeit, und die Anforderungen auch. Selbst wenn du jetzt vielleicht noch kein Logging (usw.usf.) vorhast: vielleicht kommt das ja noch, und dann willst du ja nicht alles umschreiben. Jetzt einen Dummy-Getter aufzusetzen und nur den zum Abruf zu verwenden ist nur ein Mehraufwand von einigen Zeichen - und wenn du sie brauchst hast du sie und kannst sie einfach ausbauen. Irgendwann später getter und setter nachzurüsten ist... schmerzhaft, wirklich schmerzhaft.
P.P.S.: In PHP musst du dir deine getter und setter ja nichtmal selber schreiben. __get und __set sind wirklich tolle Sachen!