Wenn Sie Ihre eigenen Getter und Setter erstellen, werden Sie zwei Funktionen für jede Eigenschaft erstellen: getPropname()
y setPropname
. Durch die Verwendung der "magischen Methode" setter/getter von PHP müssen Sie nicht für jede Eigenschaft eine eigene Methode schreiben. Sie können Eigenschaften setzen/erhalten, als ob sie öffentlich wären. Innerhalb der Überladungsfunktionen fügen Sie die für jede Eigenschaft spezifische Logik hinzu. Beispiel:
public function __set($name, $value) {
switch ($name) {
case 'comments':
// do stuff to set comments
break;
case 'parent_user':
// do stuff to set parent user
break;
}
}
public function __get($name) {
switch ($name) {
case 'comments':
// do stuff to get comments
break;
case 'parent_user':
// do stuff to get parent user
break;
}
}
Jetzt kann ich auf Kommentare zugreifen, indem ich $obj->comments
entweder zu setzen oder zu erhalten.
Um die obige Funktionalität ohne die Überladungen zu erreichen, hätte ich stattdessen 4 verschiedene Methoden schreiben müssen. Hier geht es wirklich mehr um die Organisation des Codes, sowohl in Bezug auf die eigentliche Datei als auch in Bezug auf die Schaffung einer standardisierten Schnittstelle für Objekte innerhalb eines Projekts.
Ich persönlich ziehe es vor, es Ihnen gleichzutun und für jede Eigenschaft, für die ich einen komplexen Getter/Setter benötige, eine eigene Methode zu schreiben. Für mich ist das übersichtlicher, und es gibt eine klare Trennung zwischen "einfachen" Eigenschaften eines Objekts und den Eigenschaften, die komplexer sind oder ein-zu-vielen-Beziehungen haben.
7 Stimmen
Es reduziert die Tipparbeit. Das war's.
0 Stimmen
An der gleichen Stelle, an der ich normalerweise: $object->setComment('hello') mache, kann ich stattdessen tun: __set($_comment, 'hello'); ? Ich glaube, das ist nicht das, worauf Sie sich beziehen, denn ich reduziere die Tipparbeit nicht. Nochmals vielen Dank.
3 Stimmen
Du rufst nicht an
__get
y__set
direkt. Du würdest einfach dies tun:$object->_comment = 'hello';
0 Stimmen
@MEM: Noch besser: Wenn die Getter und Setter so cool sind, wie ich sie machen würde, dann könnte man anstelle von
$object->setComment('hello');
können Sie sagen$obj->comment = 'hello';
. Der Setter würde nach einer Methode namenssetcomment
(Groß-/Kleinschreibung ist unsinnig, denn so funktionieren Funktions-/Methodennachschlagewerke) und rufen$this->setComment('hello')
für Sie.