2009-08-14 6 views

Répondre

54

Non, ce n'est pas possible.

Citant le manual page of __get:

membres surcharge ne fonctionne que dans contexte de l'objet. Ces méthodes magiques ne seront pas déclenchées dans le contexte statique . Par conséquent, ces méthodes ne peuvent pas être déclarées statiques.


En PHP 5.3, __callStatic a été ajouté; mais il n'y a pas encore __getStatic ni __setStatic; même si l'idée de les avoir/coder revient souvent sur la liste interne de php @ mailling-list.

Il y a même un Request for Comments: Static classes for PHP
Mais, encore, pas mis en œuvre (encore?)

+13

Ceci est la raison pour laquelle nous ne pouvons pas avoir bien choses ... – cvsguimaraes

+9

@cvsguimaraes statiques ne sont pas de belles choses ... –

+2

@webarto d'accord, mais compte tenu que nous sommes dans la terre PHP, ils sont de première qualité OOP caractéristiques haha ​​ – cvsguimaraes

16

Peut-être que quelqu'un encore besoin ceci:

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

Qu'est-ce que cela fait? – starbeamrainbowlabs

4

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

Vous pouvez également obtenir des propriétés statiques les accès comme les propriétés des membres, en utilisant __get():

class ClassName { 

static $data = 'smth'; 

function __get($field){ 
     if (isset($this->$field)){ 
      return $this->$field; 
     } 
     if(isset(self::$$field)){ 
      return self::$$field; // here you can get value of static property 
     } 
     return NULL; 
     } 
} 

$obj = new ClassName(); 
echo $obj->data; // "smth" 
+3

sauf que maintenant c'est public, donc vous n'avez même pas besoin de '__get' –

0

essayez ceci:

class nameClass{ 
    private static $_sData = []; 
    private static $object = null; 
    private $_oData = []; 

    public function __construct($data=[]){ 
     $this->_oData = $data; 
    } 

    public static function setData($data=[]){ 
     self::$_sData = $data; 
    } 

    public static function Data(){ 
     if(empty(self::$object)){ 
      self::$object = new self(self::$_sData); 
     } 
     return self::$object; 
    } 

    public function __get($key) { 
     if(isset($this->_oData[$key]){ 
      return $this->_oData[$key]; 
     } 
    } 

    public function __set($key, $value) { 
     $this->_oData[$key] = $value; 
    } 
} 

nameClass::setData([ 
    'data1'=>'val1', 
    'data2'=>'val2', 
    'data3'=>'val3', 
    'datan'=>'valn' 
]); 

nameClass::Data()->data1 = 'newValue'; 
echo(nameClass::Data()->data1); 
echo(nameClass::Data()->data2);