прошу подтвердить или разьяснить почему так работает, может это баг
в модели Observation ввожу поле и сеттер метод для него
private $refine=null;
....
....
....
public function setRefine($value){
$this->refine = $value;
}
гдето в контроллере
$model = new Observation('search');
$model->unsetAttributes();
$model->refine = array('some','test','values');
вылазят такие глюки
иногда, пока еще не понял почему вызывается __get(‘refine’) (CActiveRecord line 145) и выдает ошибку что данное свойство не определено. Хотя нигде даже не пытаюсь получить значение refine вне модели
самое на мой взгляд не правильное (проверял с помощью отладчика)
вызываеться __set - CActiveRecord line 156
потом CActiveRecord::setAttribute line 703
в нем property_exists($this,$name), которая возвращает true (ну все таки правильно) и срабатывает $this->$name=$value
но значение refine как было null так и осталось
далее setAttribute возвращает true, и далее метод __set не вызывает (вызвал бы если бы setAttribute вернул false) родительский __set, что бы последний вызвал нужный сеттер метод.
надеюсь понятно написал
теперь как бы такие вопросы
имея property_exists($this,$name) в setAttribute и getAttribute
становиться непонятным объявления полей как приват или протектед получается я все равно к ним буду иметь доступ по цепочке
И ведь действительно, в вашем случае private работать не будет, т.к. метод setAttribute() объявлен в родительском классе и не имеет доступа к private переменной в дочернем (Область видимости в PHP 5). Нужно объявлять её как protected и тогда всё заработает.
НО метод setRefine() в PHP 5.3+ всё равно не будет вызван, потому что property_exists, начиная с 5.3.0, проверяет существование свойства вне зависимости от его доступности, т.е. возвращает true и для private, и для protected (в отличие от более ранних версий).
Мне кажется, что такое поведение не задумывалось разработчиками Yii, но у Yii в требованиях нет PHP версии 5.3 и выше, поэтому в каких-то случаях это будет работать, а в каких-то нет независимо от версии фреймворка, что не очень хорошо
Я всего-лишь модератор, но возможно этот топик прочтет samdark, и тогда появится шанс, что всё будет исправлено. Ну или можно по-старинке “report a bug” нажать