Es ist zum Beispiel klug:
class Settings
{
private $data = array();
public function __call($key,$arguments = array())
{
return !count($arguments)) ? $this->data[$key] : $this->data[$key] = $arguments[0];
}
}
Dann tun
$Settings = new Settings();
$Settings->name('hello');
$Settings->foo('bar');
Dies hat nun zu einer unbegrenzt Menge anonymer Funktionen, die zur Verwendung bereit sind, würde dies in der Regel mit 2 Methoden aufgebaut werden, __get
y __set
Auf diese Weise können Sie eine Trennung für Methoden und Variablen definieren, zum Beispiel wie folgt
class Settings
{
private $data = array();
public function __set($key,$val)
{
$this->data[$key] = $val;
}
public function __get($key)
{
return $this->data[$key];
}
}
Dies würde es Ihnen ermöglichen, Variablen wie folgt zu setzen:
$Settings->foo = 'bar';
Sie können aber noch ein wenig weiter gehen und ein variables Registrierungssystem erstellen:
Sie können also im Grunde die obige Klasse von Settings
a VariableStorage
und gehen Sie wie folgt vor:
class User extends VariableStorage{}
class Profile extends VariableStorage{}
Und so verwenden:
$Profile = new Profile('Robert','Pitt',USER_PRIV_ADMIN);
$Profile->id = 56;
$Profile->userdata = $Database->GetUserData($Profile); //Reads $Profile->id
So müssen Sie die Methoden nur einmal definieren, und solange Sie Ihre Vererbungsstruktur nach einem guten Design aufbauen, kann sie sehr gut funktionieren.
2 Stimmen
Eine Frage: Warum? Welchen Sinn hat das gegenüber der normalen Getter/Setter-Syntax (
getName()
ysetName($name)
), oder über die magischen Methoden (mit denen Sie$foo->name = 'bar'; echo $foo->name;
)?0 Stimmen
Irwin - Diese Syntax ist nicht das, was C# tut oder wie es aussieht. Schlechte Analogie.