Bardzo ładne mbrzuchalski. Ale wydaje się, że działa tylko na zmiennych publicznych. Wystarczy zmienić przełącznik do tego, aby umożliwić mu dostęp do prywatnych/protected te:
switch($match[1]) {
case 'get': return self::${$property->name};
case 'set': return self::${$property->name} = $args[0];
}
A ty pewnie chcesz zmienić oświadczenie if
ograniczyć zmienne, które są dostępne, albo byłoby pokonać cel posiadanie ich jako prywatnych lub chronionych.
if ($reflector->hasProperty($property) && in_array($property, array("allowedBVariable1", "allowedVariable2"))) {...)
Tak na przykład mam klasy zaprojektowane, aby wyciągnąć różne dane dla mnie z odległym serwerem przy użyciu modułu ssh gruszka, i chcę dokonać pewnych założeń dotyczących katalogu docelowego na podstawie tego, co serwer to poproszony o spojrzenie. Udoskonalona wersja metody mbrzuchalskiego jest do tego idealna.
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.");
}
}
To dlatego nie możemy mieć ładny rzeczy ... – cvsguimaraes
statystyka @cvsguimaraes nie są ładne rzeczy ... –
@webarto zgodził się, ale biorąc pod uwagę, że jesteśmy w kraju PHP, są najwyższej klasy funkcje OOP haha – cvsguimaraes