Установить значение в объекте

Рейтинг: 0Ответов: 2Опубликовано: 17.02.2015

Добрый день.

Допустим, у нас существует объект:

$var = object(Taxonomies)#73 (12) {
  ["_new":"CActiveRecord":private]=>
  bool(false)
  ["_attributes":"CActiveRecord":private]=>
  array(5) {
    ["id"]=>
    string(1) "1"
    ["name"]=>
    string(9) "testName"
    ["slug"]=>
    string(9) "testSlug"
    ["code"]=>
    string(9) "testCode"
    ["count"]=>
    string(1) "0"
  }
  ["_related":"CActiveRecord":private]=>
  array(0) {
  }
  ["_c":"CActiveRecord":private]=>
  NULL
  ["_pk":"CActiveRecord":private]=>
  string(1) "2"
  ["_alias":"CActiveRecord":private]=>
  string(1) "t"
  ["_errors":"CModel":private]=>
  array(0) {
  }
  ["_validators":"CModel":private]=>
  NULL
  ["_scenario":"CModel":private]=>
  string(6) "update"
  ["_e":"CComponent":private]=>
  NULL
  ["_m":"CComponent":private]=>
  NULL
}

Вопрос: каким образом можно преобразовать его в:

$var = object(Taxonomies)#73 (12) {
  ["_new":"CActiveRecord":private]=>
  bool(false)
  ["_attributes":"CActiveRecord":private]=>
  array(5) {
    ["id"]=>
    string(1) "1"
    ["name"]=>
    string(9) "testName"
    ["slug"]=>
    string(9) "testSlug"
    ["code"]=>
    string(9) "testCode"
    ["count"]=>
    string(1) "0"
    ["custom"]=>
    string(1) "10"
  }
  ["_related":"CActiveRecord":private]=>
  array(0) {
  }
  ["_c":"CActiveRecord":private]=>
  NULL
  ["_pk":"CActiveRecord":private]=>
  string(1) "2"
  ["_alias":"CActiveRecord":private]=>
  string(1) "t"
  ["_errors":"CModel":private]=>
  array(0) {
  }
  ["_validators":"CModel":private]=>
  NULL
  ["_scenario":"CModel":private]=>
  string(6) "update"
  ["_e":"CComponent":private]=>
  NULL
  ["_m":"CComponent":private]=>
  NULL
}

То есть каким образом можно установить в массиве _attributes новое значение?

Пытался таким образом:

$var->_attributes->custom = '10';

и таким (через функцию yii):

$var->setAttribute('custom', '10');

В первом случае ошибка, во втором - custom добавляется в начало объекта, то есть перед _new, а не в _attributes.

Ответы

▲ 1Принят

Зачем? Это все внутренние свойства, которые вам никогда не нужно трогать руками.

Обновление

Пара решений:

  • просто объявите свойство у объекта, насколько помню, оно автоматом появится в attributes
  • если я неправ с первым пунктом, попробуйте хакнуть attributeNames:

    public function attributeNames()
    {
         $names = parent::attributeNames();
         $names[] = 'custom';
         return $names;
    }
    

99%, что все компоненты тем или иным способом вытягивают информацию через attributeNames.

▲ 1

Попробуйте

$var->custom = '10';