Если у нас на странице 800 комментариев (или других сущностей), то действительно где-то хранить 800 экземпляров объектов? И ->all где то в цикле создаёт объекты, привязывает к таблице и заполняет их полученными данными?
Если использовать наследника от ArrayObject, то необязательно хранить все 800 в памяти. Например,
UserCollection extends ArrayObject {
private $ids;
function __construct($where) {
$ids = db::query("SELECT id FROM Users WHERE $where")->getColumnValues('id');
}
public function offset($index) {
return new User(db::query("SELECT * FROM users WHERE id={$ids[$index]}"));
}
}
Пример грубый, небезопасный, фактически псевдокод. Но с 800 записями возникет проблема, известная как «1+N» — foreach в шаблоне вызовет 801 запрос к БД. Хранить 800 не хорошо, 801 запрос к БД ещё хуже. Выход — «страничный» кэш. При запросе, например, $users[73] выбираем (если ещё не выбрано) первые сто записей (при [173] вторые сто), инстанцируем 100 объектов в кэше (массив объектов), затирая те, что были раньше (вторая сотня затирает первую) и возвращаем 73-й (в обоих случаях). Особенно эффективен если вся обработка идёт последовательно (foreach и т. п.) — на 800 записей 9 запросов и максимум 100 объектов в памяти (вернее от работы сборщика мусора зависит, можно форсировать его работу при затирании ненужной сотни через gc_collect_cycles()), главное их в другом массиве не сохранять :)