Très belle mbrzuchalski. Mais il semble qu'il ne fonctionne que sur les variables publiques. Il suffit de changer votre commutateur à présent pour autoriser l'accès privé/protégé:les
switch($match[1]) {
case 'get': return self::${$property->name};
case 'set': return self::${$property->name} = $args[0];
}
Et vous auriez probablement souhaitez modifier l' if
déclaration de limiter le nombre de variables qui sont accessibles, ou autre chose, elle irait à l'encontre de l'objectif d'en être privé ou protégé.
if ($reflector->hasProperty($property) && in_array($property, array("allowedBVariable1", "allowedVariable2"))) {...)
Ainsi, par exemple, j'ai une classe conçu pour tirer diverses données pour moi de un serveur distant via ssh poire module, et je veux qu'il à faire certaines hypothèses sur le répertoire cible basée sur ce serveur, il est demandé de regarder. Une version remaniée de mbrzuchalski de la méthode est parfaite pour cela.
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.");
}
}