Sehr schönes mbrzuchalski. Aber es scheint nur bei öffentlichen Variablen zu funktionieren. Ändern Sie einfach Ihre Umstellung auf diese ermöglichen es private/geschützten, zuzugreifen:
switch($match[1]) {
case 'get': return self::${$property->name};
case 'set': return self::${$property->name} = $args[0];
}
Und Sie würden wahrscheinlich wollen die if
Aussage ändern, um die Variablen zu begrenzen, die zugänglich sind, sonst würde sie besiegen, um den Zweck der sie privat oder geschützt zu haben.
if ($reflector->hasProperty($property) && in_array($property, array("allowedBVariable1", "allowedVariable2"))) {...)
So zum Beispiel habe ich eine Klasse entwickelt, um verschiedene Daten für mich aus einem Remote-Server mit einer SSH-Birne Modul zu ziehen, und ich möchte es bestimmte Annahmen über das Zielverzeichnis machen, basierend auf welchem Server es ist gefragt werden zu sehen. Eine optimierte Version von mbrzuchalskis Methode ist dafür perfekt.
static public function __callStatic($method, $args) {
if (preg_match('/^([gs]et)([A-Z])(.*)$/', $method, $match)) {
$reflector = new \ReflectionClass(__CLASS__);
$property = strtolower($match[2]). $match[3];
if ($reflector->hasProperty($property)) {
if ($property == "server") {
$property = $reflector->getProperty($property);
switch($match[1]) {
case 'set':
self::${$property->name} = $args[0];
if ($args[0] == "server1") self::$targetDir = "/mnt/source/";
elseif($args[0] == "server2") self::$targetDir = "/source/";
else self::$targetDir = "/";
case 'get': return self::${$property->name};
}
} else throw new InvalidArgumentException("Property {$property} is not publicly accessible.");
} else throw new InvalidArgumentException("Property {$property} doesn't exist.");
}
}
diesem Grund sind wir nicht schön haben können Dinge ... – cvsguimaraes
@cvsguimaraes Statik sind keine netten Dinge ... –
@Webarto stimmte zu, aber wenn man bedenkt, dass wir in PHP Land sind, sind sie erstklassig OOP Features haha – cvsguimaraes