2008-09-19 88 views
6

PHP有一种自动生成类变量的方法吗?我认为我以前见过类似的东西,但我不确定。动态类变量

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

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

$this->data阵列始终是一个关联数组但它们键从类改为类。是否有任何可行的方式从$this->firstValue访问而不必定义链接?

如果是的话,它有什么缺点吗?

或者是否有一种静态方法来定义链接的方式,如果$this->data数组不包含该键,它将不会爆炸?

回答

7

使用PHP5“魔术”__get()方法。它的工作就像这样:

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

使用魔法__get__set__isset构造将允许你控制你怎么想的变量要在类中设置,同时仍然存储在一个单一阵列中的所有值。

希望这会有所帮助:)