sobrecarga overload métodos method magicos php oop properties getter

overload - php method constructor



Magic__get getter para propiedades estáticas en PHP (5)

Además, puede obtener propiedades estáticas accediendo a ellas como propiedades de miembro, usando __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"

public static function __get($value)

no funciona, e incluso si lo hizo, sucede que ya necesito el magic __get getter, por ejemplo, propiedades en la misma clase.

Esta es probablemente una pregunta de sí o no, entonces, ¿es posible?


Muy bonito mbrzuchalski. Pero parece que solo funciona en variables públicas. Simplemente cambie su interruptor a este para permitirle acceder a los privados / protegidos:

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

Y probablemente quiera cambiar la declaración if para limitar las variables a las que se puede acceder, o de lo contrario se anularía el propósito de que sean privadas o estén protegidas.

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

Así que, por ejemplo, tengo una clase diseñada para extraer varios datos de un servidor remoto utilizando un módulo ssh pera, y quiero que haga ciertas suposiciones sobre el directorio de destino en función de qué servidor se le pida que vea. Una versión ajustada del método de mbrzuchalski es perfecta para eso.

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


No, no es posible.

Citando la página de manual de __get :

La sobrecarga de miembros solo funciona en el contexto del objeto. Estos métodos mágicos no se activarán en un contexto estático. Por lo tanto, estos métodos no se pueden declarar estáticos.


En PHP 5.3, __callStatic ha sido agregado; pero todavía no hay __getStatic ni __setStatic ; incluso si la idea de tener / codificarlos a menudo vuelve a aparecer en php internals @ mailling-list.

Incluso hay una solicitud de comentarios: clases estáticas para PHP
Pero, aún así, no implementado (todavía?)


Tal vez alguien todavía necesita esto:

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


prueba esto:

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