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

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение 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 = 'а сюда только писать';
 
Аватара пользователя
aser
Сообщения: 167
Зарегистрирован: 2009.04.02, 14:25
Откуда: Киев

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

Сообщение aser »

На сайте в рецепте в коде класса не хватает

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

     function setWriteonly(){
     //…
     }
}
 
Думаю он там не помешает...
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

Спасибо, исправил.
Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

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

Сообщение BuCeFaL »

нужно ли объявлять само свойство и что именно находиться в теле метода ?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

Само свойство не обязательно. В теле всё что угодно… главное в геттере что-то вернуть, а в сеттере присвоить чему-то значение.
Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

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

Сообщение BuCeFaL »

Спасибо.
Аватара пользователя
Darth_Ixis
Сообщения: 105
Зарегистрирован: 2010.08.23, 10:03
Откуда: KZ, Almaty

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

Сообщение Darth_Ixis »

В модели таблицы(AR) у меня есть поле "name".
Если я создаю public function getName(), то при вызове $model->name getName() не срабатывает.
Так и должно быть?
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

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

Сообщение slavcodev »

Да. геттер и сеттер работают только если в классе нет одноименных свойств.
Жду Yii 3!
Wallhatt
Сообщения: 32
Зарегистрирован: 2011.04.06, 08:56

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

Сообщение Wallhatt »

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

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

Сообщение esche »

можно переопределить __get() непосредственно в модели и добавить обработку существующего свойства (name, например), хотя, пожалуй, не самое хорошее решение :)
...
Wallhatt
Сообщения: 32
Зарегистрирован: 2011.04.06, 08:56

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

Сообщение Wallhatt »

esche писал(а):можно переопределить __get() непосредственно в модели и добавить обработку существующего свойства (name, например), хотя, пожалуй, не самое хорошее решение :)
Обработку несуществующего свойства можно определить путем определения соответствующего геттера и зеттера. Для чего трогать __get() ?
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

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

Сообщение esche »

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

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

Сообщение sliderbook »

Проблемка:
есть

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

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

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

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

как тут быть?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

Можно попробовать вернуть массив по ссылке.
vasilyev.dmitro
Сообщения: 59
Зарегистрирован: 2011.07.17, 15:28

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

Сообщение vasilyev.dmitro »

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

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

 $model->param[$x]=$y
не хочет отрабатывать, хоть и getParam возвращает массив (пустой или заполненный)
Dr0ID
Сообщения: 27
Зарегистрирован: 2010.04.04, 20:02
Откуда: Новосибирск
Контактная информация:

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

Сообщение Dr0ID »

Очень странное поведение для AR, если внезапно встает потребность самоинкапсулировать поле, то сделать это без костылей не получится, тогда как для CModel все ок. Где логика?
Dr0ID
Сообщения: 27
Зарегистрирован: 2010.04.04, 20:02
Откуда: Новосибирск
Контактная информация:

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

Сообщение Dr0ID »

Самое главное, не очень понятно почему существование колонки-атрибута в метаданных приоритетнее?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

По мне так это недоработка. Закидывайте в issue на github. Есть все шанся поменять данное поведение.
com
Сообщения: 23
Зарегистрирован: 2012.02.02, 13:35

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

Сообщение com »

почему-то у read-write атрибута не происходит автоматическое присваивание значения в контроллере

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

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

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

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

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

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

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

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

$user->selectedroles = $_POST['XUser']['selectedroles'];
это баг или фича?
... Вроде бы взрослые люди, а в голове - ерунда, мечтаем, как дети, о чуде (С) Трофим
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

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

Сообщение slavcodev »

а selectedroles безопасный?
Жду Yii 3!
Ответить