魔术__get getter在PHP中的静态属性

public static function __get($value) 

不起作用,即使这样做了,恰巧我已经在同一个类中需要魔术__get getter来获取实例属性。

这可能是一个是或否的问题,所以,这是可能的?

不,这是不可能的。

引用__get的手册页 :

成员重载只能在对象上下文中使用。 这些魔术方法不会在静态上下文中触发。 因此这些方法不能被声明为静态的。

在PHP 5.3中,已经添加__callStatic ; 但是还没有__getStatic__setStatic ; 即使有/编码他们的想法往往回来在php内部@ mailling-list。

甚至有一个请求注释:PHP的静态类
但是,还没有实施(还?)

也许有人仍然需要这个:

 static public function __callStatic($method, $args) { if (preg_match('/^([gs]et)([AZ])(.*)$/', $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"); } } 

非常好的mbrzuchalski。 但似乎只对公共variables起作用。 只要改变你的开关,以允许它访问私人/受保护的:

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

而且你可能想要更改if语句来限制可访问的variables,否则就会失去使它们变为私有或受保护的目的。

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

所以举个例子,我有一个类,它使用一个ssh pear模块将我的各种数据从远程服务器中提取出来,我希望它根据要查看的服务器对目标目录做出一定的假设。 一个调整版本的mbrzuchalski的方法是完美的。

 static public function __callStatic($method, $args) { if (preg_match('/^([gs]et)([AZ])(.*)$/', $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."); } } 

另外,你可以使用__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" 

尝试这个:

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