Страница 1 из 2

Геттеры и сеттеры в Yii

Добавлено: 2009.07.07, 11:20
samdark
В большинстве классов Yii, наследуемых от CComponent (среди них модель и контроллер), поведение несколько отличается от стандартного PHP и похоже больше на свойства C#.

Код: Выделить всё

class MyModel extends CModel {
  function getReadwrite(){
    //…  
  }

  function setReadwrite(){
    //…
  }
  
  function getReadonly(){
    //…
  }
 
  function setWriteonly(){
    //…
  }
}
 
Такой класс определяет три свойства: readwrite, readonly и writeonly:

Код: Выделить всё

$model = new MyModel();

$model->readwrite = 'мы можем сюда писать';
//и читать
echo $model->readwrite;

//отсюда можно тоько читать
echo $model->readonly;

$model->writeonly = 'а сюда только писать';
 

Re: Геттеры и сеттеры в Yii

Добавлено: 2009.10.26, 15:08
aser
На сайте в рецепте в коде класса не хватает

Код: Выделить всё

     function setWriteonly(){
     //…
     }
}
 
Думаю он там не помешает...

Re: Геттеры и сеттеры в Yii

Добавлено: 2009.10.27, 20:00
samdark
Спасибо, исправил.

Re: Геттеры и сеттеры в Yii

Добавлено: 2010.09.13, 17:56
BuCeFaL
нужно ли объявлять само свойство и что именно находиться в теле метода ?

Re: Геттеры и сеттеры в Yii

Добавлено: 2010.09.13, 22:13
samdark
Само свойство не обязательно. В теле всё что угодно… главное в геттере что-то вернуть, а в сеттере присвоить чему-то значение.

Re: Геттеры и сеттеры в Yii

Добавлено: 2010.09.14, 10:20
BuCeFaL
Спасибо.

Re: Геттеры и сеттеры в Yii

Добавлено: 2011.12.09, 10:41
Darth_Ixis
В модели таблицы(AR) у меня есть поле "name".
Если я создаю public function getName(), то при вызове $model->name getName() не срабатывает.
Так и должно быть?

Re: Геттеры и сеттеры в Yii

Добавлено: 2011.12.09, 10:50
slavcodev
Да. геттер и сеттер работают только если в классе нет одноименных свойств.

Re: Геттеры и сеттеры в Yii

Добавлено: 2011.12.09, 12:37
Wallhatt
Darth_Ixis писал(а):В модели таблицы(AR) у меня есть поле "name".
Если я создаю public function getName(), то при вызове $model->name getName() не срабатывает.
Так и должно быть?
Геттеры и сеттеры реализованы через магические методы PHP __get() и __set(), которые вызываются только в том случае, если происходит обращение к несуществующему свойству класса. Если же свойство существует, то методы не вызываются. В реализации Yii в этих методах проверяется наличие соответствующих геттеров и зеттеров, например, getName() и setName().

Re: Геттеры и сеттеры в Yii

Добавлено: 2011.12.09, 17:04
esche
можно переопределить __get() непосредственно в модели и добавить обработку существующего свойства (name, например), хотя, пожалуй, не самое хорошее решение :)

Re: Геттеры и сеттеры в Yii

Добавлено: 2011.12.09, 19:27
Wallhatt
esche писал(а):можно переопределить __get() непосредственно в модели и добавить обработку существующего свойства (name, например), хотя, пожалуй, не самое хорошее решение :)
Обработку несуществующего свойства можно определить путем определения соответствующего геттера и зеттера. Для чего трогать __get() ?

Re: Геттеры и сеттеры в Yii

Добавлено: 2011.12.11, 09:56
esche
Wallhatt писал(а):
esche писал(а):можно переопределить __get() непосредственно в модели и добавить обработку существующего свойства (name, например), хотя, пожалуй, не самое хорошее решение :)
Обработку несуществующего свойства можно определить путем определения соответствующего геттера и зеттера. Для чего трогать __get() ?
Я вроде про существующее...

Re: Геттеры и сеттеры в Yii

Добавлено: 2012.01.27, 15:17
sliderbook
Проблемка:
есть

Код: Выделить всё

...
public function getData() {
    return $this->_data;
}
...
и хотим сделать

Код: Выделить всё

$this->data['key'] = 123;
т.к. сначала будет вызван __get то присвоение не произойдет

как тут быть?

Re: Геттеры и сеттеры в Yii

Добавлено: 2012.01.27, 16:22
samdark
Можно попробовать вернуть массив по ссылке.

Re: Геттеры и сеттеры в Yii

Добавлено: 2012.04.21, 11:09
vasilyev.dmitro
можно поподробнее пожалуйста. Куда и что отправлять по ссылке?
Уже мозг сломал, но

Код: Выделить всё

 $model->param[$x]=$y
не хочет отрабатывать, хоть и getParam возвращает массив (пустой или заполненный)

Re: Геттеры и сеттеры в Yii

Добавлено: 2012.07.09, 10:32
Dr0ID
Очень странное поведение для AR, если внезапно встает потребность самоинкапсулировать поле, то сделать это без костылей не получится, тогда как для CModel все ок. Где логика?

Re: Геттеры и сеттеры в Yii

Добавлено: 2012.07.09, 10:35
Dr0ID
Самое главное, не очень понятно почему существование колонки-атрибута в метаданных приоритетнее?

Re: Геттеры и сеттеры в Yii

Добавлено: 2012.07.09, 13:56
samdark
По мне так это недоработка. Закидывайте в issue на github. Есть все шанся поменять данное поведение.

Re: Геттеры и сеттеры в Yii

Добавлено: 2012.11.11, 06:27
com
почему-то у read-write атрибута не происходит автоматическое присваивание значения в контроллере

имеем модель XUser, в ней методы

Код: Выделить всё

public function getselectedroles() {
            ...
        return $selectedroles;
    }

    public function setselectedroles($sr) {
            ...
    }

в методе контроллера, когда получаем данные из представления

Код: Выделить всё

$user->attributes = $_POST['XUser']; 
присваивает все атрибуты, кроме selectedroles, а для него надо явно написать дополнительно

Код: Выделить всё

$user->selectedroles = $_POST['XUser']['selectedroles'];
это баг или фича?

Re: Геттеры и сеттеры в Yii

Добавлено: 2012.11.11, 12:59
slavcodev
а selectedroles безопасный?