Très belle mbrzuchalski. Mais il semble ne fonctionner que sur des variables publiques. Il suffit de changer votre passage à ce pour lui permettre d'accéder privés/protégés:
switch($match[1]) {
case 'get': return self::${$property->name};
case 'set': return self::${$property->name} = $args[0];
}
Et vous voulez sans doute modifier l'instruction if
pour limiter les variables qui sont accessibles, ou bien elle irait à l'encontre de les avoir privés ou protégés.
if ($reflector->hasProperty($property) && in_array($property, array("allowedBVariable1", "allowedVariable2"))) {...)
Ainsi, par exemple, j'ai une classe conçue pour tirer diverses données pour moi d'un serveur distant en utilisant un module de poire ssh, et je veux faire certaines hypothèses sur le répertoire cible en fonction de ce serveur, il est être invité à regarder. Une version modifiée de la méthode de mbrzuchalski 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.");
}
}
Ceci est la raison pour laquelle nous ne pouvons pas avoir bien choses ... – cvsguimaraes
@cvsguimaraes statiques ne sont pas de belles choses ... –
@webarto d'accord, mais compte tenu que nous sommes dans la terre PHP, ils sont de première qualité OOP caractéristiques haha – cvsguimaraes