2008-09-19 17 views
6

¿Tiene PHP un método para tener variables de clase autogeneradas? Creo que He visto algo así antes, pero no estoy seguro.Variables de clase dinámicas

public class TestClass { 
    private $data = array(); 

    public function TestClass() { 
     $this->data['firstValue'] = "cheese"; 
    } 
} 

La matriz $this->data es siempre una matriz asociativa pero teclas cambiar de clase a clase. ¿Hay alguna forma viable de acceder al desde $this->firstValue sin tener que definir el enlace?

Y si lo es, ¿hay algún inconveniente?

¿O hay un método estático para definir el enlace de una manera que no explotará si la matriz $this->data no contiene esa clave?

Respuesta

7

Utilice el método "mágico" PHP5 __get(). Que funcionaría así:

public class TestClass { 
    private $data = array(); 

    // Since you're using PHP5, you should be using PHP5 style constructors. 
    public function __construct() { 
     $this->data['firstValue'] = "cheese"; 
    } 

    /** 
    * This is the magic get function. Any class variable you try to access from 
    * outside the class that is not public will go through this method. The variable 
    * name will be passed in to the $param parameter. For this example, all 
    * will be retrieved from the private $data array. If the variable doesn't exist 
    * in the array, then the method will return null. 
    * 
    * @param string $param Class variable name 
    * 
    * @return mixed 
    */ 
    public function __get($param) { 
     if (isset($this->data[$param])) { 
      return $this->data[$param]; 
     } else { 
      return null; 
     } 
    } 

    /** 
    * This is the "magic" isset method. It is very important to implement this 
    * method when using __get to change or retrieve data members from private or 
    * protected members. If it is not implemented, code that checks to see if a 
    * particular variable has been set will fail even though you'll be able to 
    * retrieve a value for that variable. 
    * 
    * @param string $param Variable name to check 
    * 
    * @return boolean 
    */ 
    public function __isset($param) { 
     return isset($this->data[$param]); 
    } 

    /** 
    * This method is required if you want to be able to set variables from outside 
    * your class without providing explicit setter options. Similar to accessing 
    * a variable using $foo = $object->firstValue, this method allows you to set 
    * the value of a variable (any variable in this case, but it can be limited 
    * by modifying this method) by doing something like: 
    * $this->secondValue = 'foo'; 
    * 
    * @param string $param Class variable name to set 
    * @param mixed $value Value to set 
    * 
    * @return null 
    */ 
    public function __set($param, $value) { 
     $this->data[$param] = $value; 
    } 
} 

Usando la magia __get, __set y __isset constructores le permitirá controlar la forma en que desea variables que se establecen en una clase al tiempo que el almacenamiento de todos los valores en una sola matriz.

Espero que esto ayude :)

Cuestiones relacionadas