7 Stimmen

Php __get und __set magische Methoden - warum brauchen wir die hier?

Auf Zend Quick Start Guide hier http://framework.zend.com/manual/en/learning.quickstart.create-model.html können wir sehen:

class Application_Model_Guestbook
{
    protected $_comment;
    protected $_created;
    protected $_email;
    protected $_id;

    public function __set($name, $value);
    public function __get($name);

    public function setComment($text);
    public function getComment();
...

Normalerweise erstelle ich meine Getter und Setter ohne eine magische Methode. Ich habe dies in der Kurzanleitung gesehen, und ich verstehe nicht, warum wir dies benötigen.

Kann mir jemand weiterhelfen?

Herzlichen Dank!

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';

10voto

Matthew Punkte 46409

Sie rufen (normalerweise) nie an __set o __get direkt. $foo->bar wird anrufen $foo->__get('bar') automatisch, wenn bar ist nicht sichtbar und __get existiert.

In dem Tutorial, auf das Sie verlinkt haben, werden die Getter und Setter so eingerichtet, dass sie automatisch die entsprechenden individuellen Get/Set-Funktionen aufrufen. Also $foo->comment = 'bar' ruft indirekt $foo->setComment('bar') . Das ist nicht notwendig... es ist nur eine Annehmlichkeit.

In anderen Fällen, __get kann nützlich sein, um etwas zu erstellen, das wie eine schreibgeschützte Variable aussieht.

9voto

Chris Baker Punkte 48263

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.

1voto

Brian Driscoll Punkte 18851

En __get y __set gibt es magische Methoden für ZWEI Gründe:

  1. So müssen Sie keine Zeit damit verbringen, einfache Zugriffsmethoden für alle Ihre Eigenschaften zu erstellen.

  2. Damit Sie die Überladung von Eigenschaften implementieren können.

Wenn Sie Immobilien haben, die eine besondere Behandlung benötigen, dann sind die magischen Methoden nichts für Sie. Wenn Ihre Eigenschaften jedoch nur Daten enthalten und keine Abhängigkeiten bestehen, gibt es keinen Grund, die magischen Methoden nicht zu verwenden.

1voto

James C Punkte 13821

Im weiteren Verlauf des Tutorials werden Sie aufgefordert, die __get() y __set() Methoden, damit Sie sehen, warum sie da sind.

Mit magischen Handhabung wie das können Sie einige nette Sachen wie sogar machen "nur lesen" Eigenschaften zu tun und kann verhindern, dass Sie Ihre Klasse mit einer chaotischen Last von Getter / Setter aufblasen.

0voto

Manuel S. Punkte 1

Sie werden auf Probleme stoßen, wenn Sie Folgendes verwendet haben __set und die Setter-Funktionalität in einer untergeordneten Klasse außer Kraft setzen wollen. Sie müssen den gesamten Code in __set und nur den spezifischen Teil ändern, anstatt einfach eine bestimmte Setter-Funktion zu überschreiben -> redundanter Code

Dieses Problem kann umgangen werden, indem man die spezifische setter in __set (Dank an cHao für den Tipp).

Beispiel:

class Foo1 {
   protected $normal;
   protected $special;

   public function setSpecial($special) {
      if ($special == isReallySpecial()) {
         $this->special = $special;
      }
   }

   public function __set($key, $value) {
      switch ($key) {
         case 'normal':
            $this->normal = $value;
            break;
         case 'special':
            $this->setSpecial($value);
      }
   }
}

class Foo2 extends Foo1 {
   public function setSpecial($special) {
      if ($special == isNotReallySpecial()) {
         $this->special = $special;
      }
   }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X