muy agradables mbrzuchalski. Pero parece que solo funciona en variables públicas. Sólo cambia el interruptor a esta para que pueda acceder a los privados/protegidas:
switch($match[1]) {
case 'get': return self::${$property->name};
case 'set': return self::${$property->name} = $args[0];
}
Y usted probablemente querrá cambiar la declaración if
para limitar las variables que son accesibles, o de lo contrario sería contrario al propósito de haciéndolos ser privados o protegidos.
if ($reflector->hasProperty($property) && in_array($property, array("allowedBVariable1", "allowedVariable2"))) {...)
Así, por ejemplo, tengo una clase diseñada para tirar de varios datos para sacarme de un servidor remoto a través de un módulo ssh pera, y lo quiero hacer ciertas suposiciones sobre el directorio de destino en función de qué servidor es se le pide que mire. Una versión ajustada del método de mbrzuchalski es perfecta para eso.
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.");
}
}
Esto es por lo que no podemos tener Niza cosas ... – cvsguimaraes
@cvsguimaraes las cosas estáticas no son cosas bonitas ... –
@webarto estuvo de acuerdo, pero considerando que estamos en tierra PHP, son características OOP de primera categoría jaja – cvsguimaraes