2012-04-09 16 views
-3

Mögliche Duplizieren:
Is it really that wrong not using setters and getters?
Why use getters and setters?Wozu sind Getter/Setter gut?

Ich habe immer schon gefragt, warum Menschen Getter/Setter in PHP statt mit den öffentlichen Eigenschaften mit Hilfe?

Aus einer anderen Frage, habe ich diesen Code kopiert:

<?php 
class MyClass { 
    private $firstField; 
    private $secondField; 

    public function __get($property) { 
    if (property_exists($this, $property)) { 
     return $this->$property; 
    } 
    } 

    public function __set($property, $value) { 
    if (property_exists($this, $property)) { 
     $this->$property = $value; 
    } 

    return $this; 
    } 
} 
?> 

ich keinen Unterschied zwischen diesem sehen und mit den öffentlichen Bereichen.

Nun, ich weiß, es kann helfen Sie uns Daten in beiden Getter und Setter zu validieren, aber das obige Beispiel nur passt es nicht

+1

Bitte sehen: http://stackoverflow.com/questions/1568091/why-use-getters-and-setters –

+0

@genesis +1. Ich benutze sie auch nicht. Dafür ist ein __construct da! – FredTheWebGuy

Antwort

7

Getter und Setter verwendet werden, um Code außerhalb der Klasse zu verhindern, dass der Zugriff auf Implementierungsdetails. Vielleicht heute von Daten einig Stück ist nur eine Zeichenfolge, aber morgen ist es durch Verbinden von zwei anderen Saiten zusammen und auch halten eine Zählung der Anzahl, wie oft die Zeichenfolge abgerufen werden (OK, erfundenes Beispiel) erstellt werden.

Der Punkt ist, dass der Zugriff auf Ihre Klasse zu zwingen, durch Methoden zu gehen, du bist frei zu ändern, wie Ihre Klasse Dinge tut, ohne dass anderen Code zu beeinflussen. Öffentliche Eigenschaften geben Ihnen diese Garantie nicht.

Auf der anderen Seite, wenn alles, was Sie tun mögen, Daten hält, dann öffentliche Eigenschaften sind in Ordnung, aber ich denke, dass ein Sonderfall ist.

+0

Oh, also der Hauptgrund ist, dass Sie den Wert vor der Einstellung überprüfen können, ohne ihn bei allen Vorkommen der Eigenschaft zu ändern? – genesis

+0

Ja, das ist ein weiterer guter Grund. Validierungscode an einem Ort ist eine sehr gute Sache. –

1

Mit Getter und Setter Sie die Kontrolle über die Eigenschaften einer Klasse erhalten. Schauen Sie, wie dieses Beispiel:

<?php 
class User 
{ 
    public function $name; 

    public function __construct($name) 
    { 
    $this->setName($name); 
    } 

    public function setName($name) 
    { 
    if (!preg_match('/^[A-Za-z0-9_\s]+$/')) { 
     throw new UnexpectedValueException(sprintf('The name %s is not valid, a name should only contain letters, numbers, spaces and _', $name); 
    } 
    $this->name = $name; 
    } 
} 
$foo = new User('Foo'); // valid 
$foo->name = 'Foo$%^&$#'; // ahh, not valid, but because of the public property why can do this 

Wenn Sie die Eigenschaft protected oder private machen, dies nicht getan werden kann, und Sie können die Kontrolle über das, was in der Eigenschaft ist.

+0

Hmm, das passt nicht zu meinem Beispielcode - Sie haben tatsächlich einen neuen Setter für jede Eigenschaft. Ich nicht. Aber ich bekommen, was Sie meinen – genesis

+0

@genesis Ja. Ich benutze nie die Zauberer/Getter. Ein Grund, warum die magischen Methoden nützlich sind, ist, wenn Sie die Elemente in einer Eigenschaft in der Klasse speichern möchten, zum Beispiel in einem Registery oder Service Container. –

+0

Beispiel für den obigen Kommentar: http://snipplr.com/view/64458/a-simple-registery/ –