Auf Zend Quick Start Guide hier Ссылка können wir sehen:
%Vor%Normalerweise erstelle ich meine Getter und Setter ohne irgendeine magische Methode. Ich habe das in der Kurzanleitung gesehen, und ich verstehe nicht, warum wir das brauchen sollten.
Kann mir jemand helfen?
Vielen Dank
Sie rufen (normalerweise) niemals __set
oder __get
direkt an. $foo->bar
ruft $foo->__get('bar')
automatisch auf, wenn bar
nicht sichtbar ist und __get
existiert.
In dem Tutorial, mit dem Sie verlinkt haben, werden Getter und Setter so eingestellt, dass sie automatisch die entsprechenden individuellen Get / Set-Funktionen aufrufen. So wird $foo->comment = 'bar'
indirekt $foo->setComment('bar')
aufrufen. Das ist nicht notwendig ... es ist nur eine Annehmlichkeit.
In anderen Fällen kann __get
nützlich sein, um etwas zu erstellen, das wie eine schreibgeschützte Variable aussieht.
Wenn Sie Getter und Setter selbst erstellen, haben Sie für jede Eigenschaft zwei Funktionen: getPropname()
und setPropname
. Mit PHP "magic method" Setter / Getter schreiben Sie nicht einzelne Methoden für jede Eigenschaft. Sie können Eigenschaften festlegen / abrufen, als wären sie öffentlich. Innerhalb der Überladungsfunktionen fügen Sie die für jede Eigenschaft spezifische Logik hinzu. Beispiel:
Jetzt kann ich auf Kommentare zugreifen, indem ich $obj->comments
entweder zum Setzen oder Abrufen verwende.
Um die obige Funktionalität ohne die Überladungen zu erreichen, hätte ich stattdessen vier verschiedene Methoden schreiben müssen. Das ist wirklich mehr über die Code-Organisation, sowohl in Bezug auf die tatsächliche Datei als auch in Bezug auf die Erstellung einer standardisierten Schnittstelle für Objekte innerhalb eines Projekts.
Ich persönlich bevorzuge das, was Sie tun, und schreibe separate Methoden für jede Eigenschaft, für die ich einen komplexen Getter / Setter brauche. Für mich ist es klarer organisiert, und es gibt eine klare Trennung zwischen "einfachen" Eigenschaften eines Objekts und solchen Eigenschaften, die eine größere Komplexität oder Eins-zu-Viele-Beziehungen haben.
Die Zaubermethoden __get
und __set
existieren für ZWEI Gründe:
Damit Sie keine Zeit damit verbringen müssen, Vanilla Accessor-Methoden für all Ihre Eigenschaften zu erstellen.
Damit Sie das Überladen von Eigenschaften implementieren können.
Wenn Sie Eigenschaften haben, die spezielle Behandlung benötigen, dann sind die magischen Methoden nicht für Sie. Wenn Ihre Eigenschaften jedoch nur Daten enthalten und keine Abhängigkeiten bestehen, gibt es keinen Grund, NICHT die magischen Methoden zu verwenden.
Im weiteren Verlauf des Tutorials können Sie die Methoden __get()
und __set()
ändern, damit Sie sehen, warum sie da sind.
Wenn man magischen Umgang damit hat, kann man einige nette Dinge tun, wie zum Beispiel "Nur-Lesen" -Eigenschaften und kann verhindern, dass man seine Klasse mit einer unordentlichen Ladung Getter / Setter aufbläht.
Sie werden auf Probleme stoßen, wenn Sie __set
verwendet haben und die Setter-Funktionalität in einer untergeordneten Klasse überschreiben möchten. Sie müssen den gesamten Code in __set
kopieren und nur den spezifischen Teil ändern, anstatt einfach nur eine bestimmte Setter-Funktion zu überschreiben - & gt; redundanter Code
Dieses Problem kann vermieden werden, indem die spezifische setter
in __set
aufgerufen wird (Danke an cHao für den Tipp ).
Beispiel:
%Vor%Tags und Links php zend-framework magic-methods