Как динамически писать имя свойства объекта PHP?
У меня есть свойства объекта в моем коде, которые выглядят следующим образом:
$obj ->field_name_cars[0];
$obj ->field_name_clothes[0];
Проблема заключается в том, что у меня есть 100 имен полей и вам нужно написать динамическое имя свойства. В противном случае имя объекта и ключи для свойства всегда будут одинаковыми. Поэтому я попробовал:
$obj -> $field[0];
Надеемся, что имя свойства будет динамически изменено и получить доступ к правильным значениям. Но я продолжаю получать поле undefined property $в поле stdClass:: $;
Более или менее я пытаюсь динамически писать php до его выполнения, чтобы он мог выводить правильные значения. Мысли о том, как подойти к этому?
Ответы
Ответ 1
Обновление для PHP 7.0
В PHP 7 представлен изменяется как косвенные переменные и свойства обрабатываются на уровне анализатора (см. соответствующий RFC для получения более подробной информации). Это приближает фактическое поведение к ожидаемому, и означает, что в этом случае $obj->$field[0]
приведет к ожидаемому результату.
В случаях, когда нежелательное поведение по умолчанию (теперь улучшено), фигурные скобки все еще можно использовать для переопределения, как показано ниже.
Оригинальный ответ
Напишите доступ следующим образом:
$obj->{$field}[0]
Этот трюк "заключить с фигурными скобками" полезен в PHP всякий раз, когда есть неоднозначность из-за переменных переменных.
Рассмотрим исходный код $obj->$field[0]
- означает ли это "доступ к свойству, имя которого задано в $field[0]
", или "доступ к элементу с ключом 0
свойства, имя которого указано в $field
"? Скобки позволяют вам быть явным.
Ответ 2
Я думаю, что вы ищете нотацию переменной переменной, которая при доступе к значениям из других массивов/объектов лучше всего использовать с использованием фигурного синтаксиса в виде скобок:
$obj->{field[0]}
Ответ 3
Волшебный метод __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
и возвращает правильное значение.
Ответ 4
aboulfazl, поскольку методы PHP 5.3.3 с тем же именем, что и класс, не будут рассматриваться как конструктор!
YourClass
{
public $any = false;
public function __construct($any = null)
{
$this->any = (is_null($any) ? $this->any : $any);
}
}
Это работает, но не спрашивает владелец темы, Джон дает азеру!
Ответ 5
С наследованием.
для примера:
YourClass extends stdClass {
public function YourClass() {
$this->AnyProperty="any";
}
}
Теперь AnyProperty динамически объявляется.