У меня есть свойства объекта в моем коде, которые выглядят следующим образом:
$obj ->field_name_cars[0]; $obj ->field_name_clothes[0];
Проблема в том, что у меня есть 100 имен полей и вам нужно написать динамическое имя свойства. В противном случае имя объекта и ключи для свойства всегда будут одинаковыми. Поэтому я попробовал:
$obj -> $field[0];
Надеясь, что имя свойства будет динамически изменено и получить доступ к правильным значениям. Но я продолжаю получать поле неопределенного свойства $ в поле stdClass :: $;
Более или менее я пытаюсь динамически писать php до его выполнения, чтобы он мог выводить правильные значения. Мысли о том, как подойти к этому?
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 динамически объявляется.