upd: *FIXED*
Мы сегодня наткнулись на серьезный недостаток архитектуры Active Record.
Программист написал в конструкторе модели Active Record обращение к несуществующему полю (к приватному полю родительского класса).
Пошел вызов CActiveRecord::__get(), оттуда - $this->getMetaData(), там вызов self::model(get_class($this)) - и там new $classname.
Рекурсия, сегфолт без логов, потерянный день, срыв запуска проекта.
Quang - говноархитектор. Как в его светлую голову пришла идея создавать экземпляр объекта при создании экземпляра объекта - непонятно.
Рекурсивное создание объекта - не исклчительная ситуация. При первом обращении к модели ActiveRecord всегда создается дополнительный instance для ... получения данных о структуре таблицы в базе. Этот дублирующий объект создается с параметром: new $className(null), который введен для разрыва бесконечной рекурсии.
Почему бы не получать информацию из отдельного класса, написанного для получения информации о структуре базы? Не знаю. Но злюсь.
Обращение к несуществующему полю - ошибка. Но архитектура, при которой ошибка приводит к сегфолту и потере дня целой командой - это дерьмо. Переведу на английский и напишу это ему.
Мы сегодня наткнулись на серьезный недостаток архитектуры Active Record.
Программист написал в конструкторе модели Active Record обращение к несуществующему полю (к приватному полю родительского класса).
Пошел вызов CActiveRecord::__get(), оттуда - $this->getMetaData(), там вызов self::model(get_class($this)) - и там new $classname.
Рекурсия, сегфолт без логов, потерянный день, срыв запуска проекта.
Quang - говноархитектор. Как в его светлую голову пришла идея создавать экземпляр объекта при создании экземпляра объекта - непонятно.
Рекурсивное создание объекта - не исклчительная ситуация. При первом обращении к модели ActiveRecord всегда создается дополнительный instance для ... получения данных о структуре таблицы в базе. Этот дублирующий объект создается с параметром: new $className(null), который введен для разрыва бесконечной рекурсии.
Почему бы не получать информацию из отдельного класса, написанного для получения информации о структуре базы? Не знаю. Но злюсь.
Обращение к несуществующему полю - ошибка. Но архитектура, при которой ошибка приводит к сегфолту и потере дня целой командой - это дерьмо. Переведу на английский и напишу это ему.