Normalerweise sind diese Methoden nützlich, wenn Sie mit einer API eines Drittanbieters kommunizieren oder wenn die Struktur der Methoden/Mitglieder unklar ist.
Nehmen wir an, Sie schreiben einen generischen XML-RPC-Wrapper. Da Sie die verfügbaren Methoden vor dem Herunterladen der WDL-Datei nicht kennen, ist es sinnvoll, Overloading zu verwenden.
Dann wird anstelle des Schreibens der folgende:
$xmlrpc->call_method('DoSomething', array($arg1, $arg2));
Sie verwenden können:
$xmlrpc->DoSomething($arg1, $arg2);
, die eine natürlichere Syntax ist.
Sie können das Überladen von Elementen auch auf die gleiche Weise wie das Überladen von Methoden für variable Objekte verwenden.
Nur eine Sache, auf die Sie achten sollten: Beschränken Sie die Verwendung nur auf Objekte mit variabler Struktur oder verwenden Sie sie nur für syntaktische Verknüpfungen zu Getter und Setter. Es macht Sinn, Getter und Setter in Ihrer Klasse zu halten Business-Logik in mehreren Methoden zu trennen, aber es ist nichts falsch daran als eine Verknüpfung mit:
class ShortcutDemo {
function &__get($name) {
// Usually you want to make sure the method
// exists using method_exists, but for sake
// of simplicity of this demo, I will omit
// that logic.
return call_user_method('get'.$name, $this);
}
function __set($name, &$value) {
return call_user_method('set'.$name, $this, $value);
}
private $_Name;
function &getName() { return $this->_Name; }
function setName(&$value) { $this->_Name = $value; }
}
Auf diese Weise können Sie weiterhin Ihre Getter und Setter mit zu validieren und stellen Sie Ihre Daten, und verwenden immer noch die syntaktischen Verknüpfungen als solche:
$shortcut->Name = 'Hello';
Obwohl ich noch nicht Getters und Setter loswerden würde. Mehrere Methoden, die Geschäftsregeln für die verschiedenen individuellen Eigenschaften enthalten, sind in der Regel leichter zu warten und zu debuggen als eine große Methode, die alle Geschäftsregeln für alle Eigenschaften enthält. Ich würde einfach '__get()' und '__set()' für eine Abkürzung verwenden, um 'getX',' setX' aufzurufen. Die Objektüberladung muss nur für variable Strukturobjekte beibehalten werden. –
Lesen Sie meine aktualisierte Version. –
Dies funktioniert jedoch nicht wirklich wie C# Get/Set-Eigenschaft. Zumindest nicht so flexibel, wenn Sie überprüfen oder validieren möchten, was eingestellt ist. – Extrakun