PHP-Klasse def: Einzelne Accessoren / Mutatoren oder __set () mit switch ()?

8

Wenn Sie eine PHP-Klasse definieren, welche ist die bevorzugte / beste Vorgehensweise? Gibt es irgendwelche wichtigen Unterschiede, die ich übersehen habe?

Es scheint, als könnte es einfacher, übersichtlicher und bequemer sein, eine __set() magic-Methode zu schreiben und ein switch() -Konstrukt darin einzufügen mit Fällen für alle privaten Mitglieder, denen ich den Zugriff erlauben möchte. Es würde nicht automatisch aus der Klasse heraus aufgerufen, aber auch nicht setFoo() , also wenn ich den Accessor / Mutator intern verwenden möchte, müsste ich eine Methode explizit aufrufen.

Der andere Unterschied besteht darin, dass ich im Code außerhalb der Klasse immer auf vars zugreifen konnte, genauso wie $obj->foo , ob öffentlich (direkt) oder privat (mit __set() ), anstatt viele separate Methoden zu verwenden.

Ich denke, das kommt hauptsächlich auf eine ästhetische Entscheidung an. Zum Beispiel, wenn ich Adressdaten für einen Kauf habe, möchte ich nicht 16 oder mehr separate Accessor-Methoden nur für Vorname, Nachname, Adresse1, Adresse2, Stadt, Staat usw. für Versand- und Rechnungsdaten haben.

Gibt es irgendwelche wichtigen Unterschiede, die ich übersehen habe? (Könnte eine ausgeklügelte IDE es ablehnen, einen Mitgliedsnamen außerhalb der Klasse automatisch zu vervollständigen, weil dieser als privat markiert ist?) Habe ich meine eigene ursprüngliche Frage so ziemlich beantwortet? Vielen Dank im Voraus für Ihre Eingabe.

    
Wiseguy 07.10.2009, 11:38
quelle

2 Antworten

7

Gehen Sie mit den einzelnen Accessoren für jedes Mitglied, das Sie von außen zugänglich sein wollen. Ich habe beide versucht und diese Gründe gefunden, die Accessoren zu benutzen:

  • Was auch immer Sie verwenden, um Ihre API zu dokumentieren (doxygen / PHPdoc / Zend), die generierten Dokumente zeigen nicht die Mitglieder, auf die über magische Funktionen zugegriffen werden kann.
  • Sie können die Accessoren dokumentieren. Sie sollten wirklich eine Zeile wie diese in der Dokumentation setzen können: „ Wichtig Mit dieser Funktion in der Datenbank verbindet, wird es wirklich langsam sein, verwenden otherFunction (), wenn Sie können!“.
  • Die Implementierung des Accessors ist für jedermann leicht sichtbar. Ich möchte nicht in die Details einer 200-zeilenigen magischen Funktion einsteigen, um zu überprüfen, ob der Accessor irgendetwas anderes tut, als den Wert zu setzen / zu bekommen (deshalb schreiben wir schließlich Accessoren).
  • Sie haben bereits die automatische Vervollständigung von IDEs erwähnt.
  • Die __get () Funktion hat einen gut definierte Funktionskopf, so dass Sie nicht in der Lage sein werden, Getter zu schaffen, die einen Verweis zurückgeben, zum Beispiel (was wirklich toll ist, wenn sie mit Arrays arbeiten, dh $numbers = &$object->getNumbers(); $numbers[] = 4; - ohne die Referenz, müssen Sie den Setter erneut aufrufen.)
soulmerge 07.10.2009, 11:51
quelle
4

Der größte Unterschied, den ich sehe, ist mit phpdoc:

  • mit __set , können Sie phpdoc nicht für jeden Accessor
  • generieren
  • phpdoc wird von moderns IDE verwendet, das bedeutet auch, dass Sie weder Typhinweis noch Codevervollständigung erhalten, wenn Sie magic-methods verwenden ( @property könnte in diesem Punkt jedoch helfen) .

Persönlich würde ich selbst mit Definition von Accessoren gehen, auch wenn es bedeutet, etwas mehr Code zu schreiben:

  • kein Problem mit phpdoc
  • Sie können alle gewünschten Parameter und Rückgabetypen verwenden
  • Sie geben explizit an, welche Methoden verwendet werden können
  • einfacher zu verwenden spezifischen Code für jeden Wert, ohne eine wirklich lange __set -Methode.

Auch würde ich diese Accessor-Methoden verwenden, wenn ich Eigenschaften innerhalb der Klasse einstelle: es bedeutet ein bisschen mehr Code, ja - aber es bedeutet auch, den spezifischen Code durchzugehen (wie Code, um einige Sachen zu überprüfen), die sie enthalten / p>

Wenn Sie schließlich nur einige Eigenschaften zum Speichern von Daten verwenden und kein bestimmtes Verhalten definieren müssen, warum sollten Sie sie nicht als öffentlich verfügbar machen und Benutzern den direkten Zugriff ermöglichen?

    
Pascal MARTIN 07.10.2009 11:53
quelle

Tags und Links