2009-08-14 13 views

Antwort

54

Nein, das ist nicht möglich.

das Zitiert manual page of __get:

Mitglied Überlastung funktioniert nur in Objektkontext. Diese magischen Methoden werden nicht im statischen Kontext ausgelöst. Daher können diese Methoden nicht als statisch deklariert werden.


In PHP 5.3, __callStatic hinzugefügt worden ist; aber es gibt noch keine __getStatic noch __setStatic; auch wenn die Idee, sie zu haben, häufig auf der php internals @ mailling-list zurückkommt.

Es gibt sogar eine Request for Comments: Static classes for PHP
aber noch nicht umgesetzt (noch?)

+13

diesem Grund sind wir nicht schön haben können Dinge ... – cvsguimaraes

+9

@cvsguimaraes Statik sind keine netten Dinge ... –

+2

@Webarto stimmte zu, aber wenn man bedenkt, dass wir in PHP Land sind, sind sie erstklassig OOP Features haha ​​ – cvsguimaraes

16

Vielleicht hat jemand noch brauchen dies:

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

Was macht das? – starbeamrainbowlabs

4

Sehr schönes mbrzuchalski. Aber es scheint nur bei öffentlichen Variablen zu funktionieren. Ändern Sie einfach Ihre Umstellung auf diese ermöglichen es private/geschützten, zuzugreifen:

switch($match[1]) { 
    case 'get': return self::${$property->name}; 
    case 'set': return self::${$property->name} = $args[0]; 
} 

Und Sie würden wahrscheinlich wollen die if Aussage ändern, um die Variablen zu begrenzen, die zugänglich sind, sonst würde sie besiegen, um den Zweck der sie privat oder geschützt zu haben.

if ($reflector->hasProperty($property) && in_array($property, array("allowedBVariable1", "allowedVariable2"))) {...) 

So zum Beispiel habe ich eine Klasse entwickelt, um verschiedene Daten für mich aus einem Remote-Server mit einer SSH-Birne Modul zu ziehen, und ich möchte es bestimmte Annahmen über das Zielverzeichnis machen, basierend auf welchem ​​Server es ist gefragt werden zu sehen. Eine optimierte Version von mbrzuchalskis Methode ist dafür perfekt.

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

Sie können aber auch statische Eigenschaften erhalten sie wie Elementeigenschaften zugreifen, mit __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

außer dass es jetzt öffentlich ist, also brauchst du nicht einmal '__get' –

0

versuchen Sie dies:

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);