Доступ к объектной переменной через двойной знак доллара - PullRequest
2 голосов
/ 02 сентября 2011

Я создаю класс для удобного получения переменных из других php-файлов.

Проблема в том, что я использую двойной знак доллара, чтобы создать хеш-карту в стиле $ variable_name => $$ varible_real_valueи я хочу, чтобы все атрибуты итератора были переменными класса.Определение новой переменной в области видимости __constructor может перезаписывать переменные из файлов.Проблемным фрагментом кода является

foreach($this->args AS $this->iterator) {
    $this->data->$this->iterator = $$this->iterator;
}  

Но когда я заменю его на

foreach($this->args AS $var) {
    $this->data->$var = $$var;
}  

Переменная '$ var' будет перезаписана.

class DataFile {

private
    $data = null,
    $iterator = null,
    $args = null
;

public function __construct($file) {
    require($file);
    unset($file);
    $this->args = func_get_args();
    array_shift($this->args);
    $this->data = new ArrayObject();
        foreach($this->args AS $this->iterator) {
            $this->data->$this->iterator = $$this->iterator;
        }    
}

public function __get($key) {
    return $this->data->$key;
}

}

Пример использования:

$conf = new DataFile('mysql.php', 'var');
$databaseName = $conf->var->database;

Есть ли обходной путь для этого,

Спасибо

1 Ответ

4 голосов
/ 02 сентября 2011

$this->data->$this->iterator неоднозначно.Вы имеете в виду свойство $this->data с именем $this->iterator или свойство iterator $this->data->$this?

Вам необходимо сделать его однозначным:

$this->data->{$this->iterator}

То же самое касается $$this->iterator.

...