67 votes

Magic __get getter pour les propriétés statiques en PHP

 public static function __get($value)
 

ne fonctionne pas, et même si cela a fonctionné, il se trouve que j'ai déjà besoin de la propriété magique __get getter pour les propriétés d'instance de la même classe.

C'est probablement une question oui ou non, alors, c'est possible?

68voto

Pascal MARTIN Points 195780

Non, il n'est pas possible.

Citant la page de manuel de __obtenir :

Membre de la surcharge ne fonctionne que dans contexte de l'objet. Ces méthodes magiques ne sera pas déclenchée en statique contexte. Par conséquent, ces méthodes peuvent pas à être déclarées static.


En PHP 5.3, __callStatic a été ajouté ; mais il n'y a pas d' __getStatic ni __setStatic encore ; même si l'idée d'avoir/de codage leur revient souvent sur le php internals@ mailling-list.

Il y a même une Demande de Commentaires: les classes Statiques pour PHP
Mais, toujours pas mise en œuvre (pas encore ? )

21voto

mbrzuchalski Points 61

Peut-être que quelqu'un a encore besoin de ça:

 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)) {
      $property = $reflector->getProperty($property);
      switch($match[1]) {
        case 'get': return $property->getValue();
        case 'set': return $property->setValue($args[0]);
      }     
    } else throw new InvalidArgumentException("Property {$property} doesn't exist");
  }
}
 

6voto

Claymore Points 1

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.");
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X