Ich werde etwas mit dem Format dieser Frage versuchen und ich bin sehr offen für Vorschläge über einen besseren Weg, damit umzugehen.Ist dies ein vernünftiger Weg, um Getter/Setter in einer PHP-Klasse zu behandeln?
Ich wollte nicht einfach einen Haufen Code in der Frage ablegen, also habe ich den Code für die Klasse auf refactormycode gepostet.
base class for easy class property handling
Mein Gedanke war, dass die Menschen entweder Post Code-Schnipsel hier oder Änderungen auf refactormycode und Post-Links zurück zu ihren Refactorings. Ich werde Upvotes machen und darauf basierend eine Antwort akzeptieren (vorausgesetzt es gibt einen klaren "Gewinner").
Auf jeden Fall auf die Klasse selbst:
ich eine Menge Debatte über Getter/Setter-Klasse Methoden sehen und ist es besser, nur einfache Eigenschaftsvariablen direkt zugreifen oder sollte jede Klasse haben explizite get/set Methoden definiert, blah blah blah. Ich mag die Idee, explizite Methoden zu haben, falls Sie später mehr Logik hinzufügen müssen. Dann müssen Sie keinen Code ändern, der die Klasse verwendet. Aber ich hasse es, eine Million Funktionen haben, die wie folgt aussehen:
public function getFirstName()
{
return $this->firstName;
}
public function setFirstName($firstName)
{
return $this->firstName;
}
Jetzt bin ich sicher, ich bin nicht die erste Person, dies zu tun (ich hoffe, dass es einen besseren Weg, es zu tun, dass jemand kann schlage mir vor).
Grundsätzlich hat die PropertyHandler-Klasse eine __call magische Methode. Alle Methoden, die durch __call kommen und mit "get" oder "set" beginnen, werden dann an Funktionen weitergeleitet, die Werte in einem assoziativen Array setzen oder abrufen. Der Schlüssel in das Array ist der Name der aufrufenden Methode nach get oder set. Wenn also die Methode, die in __call eingeht, "getFirstName" lautet, lautet der Array-Schlüssel "FirstName".
Ich mochte __call verwenden, weil es automatisch den Fall behandelt, in dem die Unterklasse bereits eine "getFirstName" -Methode definiert hat. Mein Eindruck (und ich kann falsch liegen) ist, dass die __get & __set magischen Methoden das nicht tun.
Also hier ist ein Beispiel dafür, wie es funktionieren würde:
class PropTest extends PropertyHandler
{
public function __construct()
{
parent::__construct();
}
}
$props = new PropTest();
$props->setFirstName("Mark");
echo $props->getFirstName();
Beachten Sie, dass PropTest nicht wirklich „setFirstName“ oder „getFirstName“ Methoden und auch nicht Property. Es werden nur Array-Werte manipuliert.
Der andere Fall wäre, wo Ihre Unterklasse bereits etwas anderes erweitert. Da Sie in PHP keine echte Mehrfachvererbung haben können, können Sie Ihre Unterklasse dazu veranlassen, eine PropertyHandler-Instanz als private Variable zu verwenden. Sie müssen eine weitere Funktion hinzufügen, aber dann verhalten sich die Dinge genau so.
class PropTest2
{
private $props;
public function __construct()
{
$this->props = new PropertyHandler();
}
public function __call($method, $arguments)
{
return $this->props->__call($method, $arguments);
}
}
$props2 = new PropTest2();
$props2->setFirstName('Mark');
echo $props2->getFirstName();
Beachten Sie, wie die Unterklasse eine __call Methode verfügt, die einfach alles verläuft entlang zum Property __call Methode.
Ein weiteres gutes Argument gegen die Handhabung von Getter und Setter ist, dass es wirklich schwer zu dokumentieren ist.
In der Tat ist es im Grunde unmöglich, irgendeine Art von Dokumentgenerierungswerkzeug zu verwenden, da die expliziten Methoden, die nicht dokumentiert werden sollen, nicht existieren.
Ich habe diesen Ansatz für jetzt so gut wie aufgegeben. Es war eine interessante Lernübung, aber ich denke, es opfert zu viel Klarheit.
Aus Neugier, welche Methode verwenden Sie jetzt? – SeanJA
Getters ** und ** Setter in der gleichen Klasse ist ein Zeichen, dass die Klasse ihren Code fehlt. Untersuchen Sie den Code, der die Getter und Setter der Klasse verwendet, und verschieben Sie ihn innerhalb der Klasse, da er dort hingehört. – axiac