2008-09-19 2 views
6

Есть ли у PHP метод автогенерируемых переменных класса? I думаю Я видел что-то подобное раньше, но я не уверен.Динамические переменные класса

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

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

$this->data массив всегда ассоциативный массив, но они ключи изменяются от класса к классу. Существует ли жизнеспособный способ доступа к от $this->firstValue без указания ссылки?

И если да, есть ли какие-то недостатки?

Или существует статический метод определения ссылки способом, который не будет взорваться, если массив $this->data не содержит этот ключ?

ответ

7

Используйте метод PHP5 «magic» __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 Конструкторы позволит вам контролировать то, как вы хотите, чтобы переменные можно установить на классе в то же время сохраняя все значения в одном массиве.

Надеюсь, что это поможет :)

Смежные вопросы