#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.