Wie kann ich PHP __get () und __set () für definierte Felder in meiner Klasse verwenden?
-
19-09-2019 - |
Frage
Ich habe eine gute Lektüre der href="http://uk.php.net/manual/en/language.oop5.overloading.php" rel="nofollow noreferrer"> PHP-Spezifikationen , und die meisten Beispiele erscheinen sollte werden einfach ermöglichen die Definition von benutzerdefinierten Feldern (ähnlich stdClass).
Aber was ist mit den privaten Feldern in meiner Klasse definiert? Wie sollten diese abgerufen werden / zugewiesen? Ich könnte einen Schalter auf mögliche Werte tun und wirken auf bestimmte Werte:
class A
{
private $name;
private $age;
public function __get( $var )
{
switch ( $var )
{
case 'name':
return $this->name;
break;
case 'age':
return $this->age+10; // just to do something different ;)
break;
default:
break;
}
}
}
Ist dies die beste Methode, oder gibt es einen anderen allgemein anerkannten Best Practice? (Ich weiß nicht, ob es möglich ist, eine Schleife Klassenvariablen innerhalb einer Klasse, aber egal, das ist nicht angemessen, in den meisten Situationen, da Sie wollen nicht alles zurück.)
Lösung
Das würde sie öffentlich wirksam machen, und dies in der Regel gewinnt man nichts über nur öffentliche Eigenschaften mit (aber Sie Leistung Strafe zahlen und muß mehr Code, Risiko Bugs schreiben).
Verwenden Sie das nur, wenn Sie vorhandenen Code, die öffentliches Eigentum verwendet, und Sie plötzlich Getter / Setter müssen für sie (wie Ihr Beispiel mit age
).
Wenn Sie einen Code auszuführen, wenn Eigenschaft gelesen / geschrieben (zum Beispiel macht ablesbare nur oder träge aus der Datenbank holen), dann sollten Sie normale Getter / Setter (getAge()
/ setAge()
) verwenden.
Andere Tipps
Ich mache umfangreichen Gebrauch von __get()
und __set()
und ich habe meine Eigenschaften public
erklärt. Ich wollte das Beste aus beiden Welten, so mein IDE öffentliche Eigenschaften für mich Liste könnte, wenn ich den Namen einer Klasseninstanz geben. Wie bin ich die PHP-Interceptor Methoden zu arbeiten, auch wenn die Eigenschaften sind öffentlich und sichtbar außerhalb der Klasse?
unset () die Eigenschaften I will __get()
und __set()
auf für in der Klasse __construct()
verwendet werden
Herauszufinden dieses Verfahren ein paar Abende der Frustration nahm: -).
Ich sehe nicht viele Leute mit ihnen, aber hier ist, was ich denke.
private Variablen für das Abrufen, möchten Sie wahrscheinlich eine Liste der definierten Variablen geben, die in der Lage sind, von außen zugegriffen werden kann. Dann überprüfen, um zu sehen, ob die angeforderte Variable in diesem Array ist. Wenn ja, lassen Sie es geändert / geholt werden. Wenn nicht, entweder Fehler oder null zurück.
Ehrlich gesagt, sind die Implementierungen für diese wirklich von Fall zu Fall. Wenn Sie eine Benutzerklasse haben, die Sie alle Informationen in einem einzigen Array gespeichert werden, kann vom Benutzer $ haben könnte> Namen von $ user-> Konto [ ‚name‘], oder so ähnlich gezogen werden.
Auch in einem von Fall zu Fall, Sie könnten einige Änderungen machen, bevor ihnen Werte zu geben, wie ein Kennwort-Hashing.