Динамически добавлять свойство к объекту на основе Yii CComponent изнутри объекта в PHP?

#php #yii

#php #yii

Вопрос:

В PHP вы можете сделать следующее:

 $foo = new Foo();
$foo->$newPropertyName = $value;
  

Динамически добавлять новое свойство к объекту. Однако, когда я пытаюсь это сделать:

 $this->$newPropertyName = $value;
  

Это не работает. Как я могу динамически добавлять новое свойство изнутри объекта?

Обновить:

Мой класс наследуется от класса Yii CFormModel. CFormModel переопределяет метод PHP __set , поэтому это вызывает проблему. Как сделать то, что я хочу? Как использовать метод по умолчанию __set ?

Комментарии:

1. $foo->newPropertyName = $value;

2. @user3234352 — требуется доллар, поскольку новое имя свойства берется из переменной

3. Это не бессмыслица. $newPropretyName — это переменная, которая содержит новое имя свойства. Я не хочу создавать свойство newPropertyName . Имя свойства разработчику неизвестно. Оно будет поступать из базы данных.

Ответ №1:

 $this->newPropertyName = $value;
  

может вызываться из внутри любого метода класса. в общедоступной области это так:

 $foo = new Foo();
$foo->newPropertyName = $value;
  

при использовании $this-> вы не ставите знаки доллара.

Однако вы можете попытаться заставить php вычислить имя свойства вашей переменной (например, can vary), прежде чем присваивать его вашему свойству следующим образом:

 $foo->{$newPropertyName} = $value;
  

Ответ №2:

Это работает динамически, в вашем коде должна быть ошибка (возможно, неправильное написание $newPropertyName )?

 class Foo {

    public function addProperty($newPropertyName, $value) {
        $this->$newPropertyName = $value;
    }

}

$foo = new Foo();
$foo->addProperty('weather', 'raining');
echo $foo->weather;
  

Комментарии:

1. Хм, я только что получил ошибку «Свойство Foo.xxx не определено». Мой PHP v. — 5.4.16, так что это не должно быть проблемой.

2. Ах, я думаю, это может быть потому, что методы PHP magic __set ang __get переопределяются базовым классом. Это усложняет задачу… Базовым классом является yii CFormModel.