Подтвердить что ты не робот

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

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

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

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

$obj -> $field[0];

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

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

4b9b3361

Ответ 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 динамически объявляется.