Как динамически писать имя свойства объекта PHP?

У меня есть свойства объекта в моем коде, которые выглядят следующим образом:

$obj ->field_name_cars[0]; $obj ->field_name_clothes[0]; 

Проблема в том, что у меня есть 100 имен полей и вам нужно написать динамическое имя свойства. В противном случае имя объекта и ключи для свойства всегда будут одинаковыми. Поэтому я попробовал:

 $obj -> $field[0]; 

Надеясь, что имя свойства будет динамически изменено и получить доступ к правильным значениям. Но я продолжаю получать поле неопределенного свойства $ в поле stdClass :: $;

Более или менее я пытаюсь динамически писать php до его выполнения, чтобы он мог выводить правильные значения. Мысли о том, как подойти к этому?

Обновление для PHP 7.0

PHP 7 представил изменения в отношении того, как косвенные переменные и свойства обрабатываются на уровне анализатора (подробнее см. Соответствующий RFC ). Это приближает фактическое поведение к ожидаемому и означает, что в этом случае $obj->$field[0] даст ожидаемый результат.

В случаях, когда поведение по умолчанию (теперь улучшено) нежелательно, фигурные скобки все еще можно использовать для переопределения, как показано ниже.

Оригинальный ответ

Напишите доступ следующим образом:

 $obj->{$field}[0] 

Этот трюк «заключить с фигурными скобками» полезен в PHP всякий раз, когда возникает неоднозначность из-за переменных переменных.

Рассмотрим исходный код $obj->$field[0] – означает ли это «доступ к свойству, имя которого задано в $field[0] », или «обращение к элементу с ключом 0 свойства, имя которого дано в $field "? Скобки позволяют вам быть явным.

Я думаю, что вы ищете нотацию переменной переменной переменной, которая при доступе к значениям из других массивов / объектов лучше всего достигается с помощью фигурного скобкового синтаксиса:

 $obj->{field[0]} 

Волшебный метод __get – вы друг:

 class MyClass { private $field = array(); public function __get($name) { if(isset($this->field[$name])) return $this->field[$name]; else throw new Exception("$name dow not exists"); } } 

Применение:

 $myobj = new MyClass(); echo $myobj->myprop; 

Объяснение: Все данные вашего поля хранятся в массиве. При доступе к $myobj->myprop это свойство явно не существует в классе. Именно здесь вызывается __get . __get ищет имя в массиве field и возвращает правильное значение.

aboulfazl, поскольку методы PHP 5.3.3 с тем же именем, что и класс, не будут рассматриваться как конструктор!

  YourClass { public $any = false; public function __construct($any = null) { $this->any = (is_null($any) ? $this->any : $any); } } 

Это работает, но не спрашивает владелец темы, Джон дает азерсе!

С наследованием. например:

 YourClass extends stdClass { public function YourClass() { $this->AnyProperty="any"; } } 

Теперь AnyProperty динамически объявляется.