CActiveRecord и __isset()

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Закрыто
PoMaH4yK
Сообщения: 4
Зарегистрирован: 2013.12.23, 03:45

CActiveRecord и __isset()

Сообщение PoMaH4yK »

Здравствуйте.

Пилю свою обертку для Yii 1.14.
Наткнулся на вот такой момент в классе CActiveRecord

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

    public function __isset($name)
    {
        if(isset($this->_attributes[$name]))
            return true;
        elseif(isset($this->getMetaData()->columns[$name]))
            return false;
        elseif(isset($this->_related[$name]))
            return true;
        elseif(isset($this->getMetaData()->relations[$name]))
            return $this->getRelated($name)!==null;
        else
            return parent::__isset($name);
    }
 
Прошу обратить внимание на то, что если у модели нет какого-то атрибута, но есть такое поле в таблице (это может быть достигнуто если поле в БД имеет значение NULL), то возвращается false, т.е. атрибут не существует. Полагаю это ошибка.
Для подтверждения рассмотрим метод __get() в том же CActiveRecord

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

    public function __get($name)
    {
        if(isset($this->_attributes[$name]))
            return $this->_attributes[$name];
        elseif(isset($this->getMetaData()->columns[$name]))
            return null;
        elseif(isset($this->_related[$name]))
            return $this->_related[$name];
        elseif(isset($this->getMetaData()->relations[$name]))
            return $this->getRelated($name);
        else
            return parent::__get($name);
    }
 
Если случается указанная мною выше ситуация (у модели нет какого-то атрибута, но есть такое поле в таблице), геттер возвращает null и не выдает исключение несуществующего параметра объекта.
Раньше часто напарывался на подобную ситуацию используя Twig, который всегда проверяет наличие параметра и выдает ошибку при отрицательном ответе метода __isset(). Решал через getAttribute().

В обертке я, конечно, переопределю метод __isset(), но прошу пояснить, баг это или некая фича.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: CActiveRecord и __isset()

Сообщение yan »

isset это не (существует или нет), а (установлено какое-то значение или нет), так что все правильно
PoMaH4yK
Сообщения: 4
Зарегистрирован: 2013.12.23, 03:45

Re: CActiveRecord и __isset()

Сообщение PoMaH4yK »

Хмм, что ж, все верно. Почитал доки по isset :D

Спасибо за ответ.
Закрыто