Если совсем базовые знания, то могу поделиться собственным опытом. Мои первые два класса были для работы с БД и обработки изображений.
Класс БД обеспечивал соединение, создание основных строк-запросов (выбор, вставка, апдейт, удаление), обеспечение многотабличных запросов, обеспечение безопасных запросов (обработка тегов, лишних пробелов, удаление SQL инъекций), сам запрос к БД и обработка результатов. Также класс содержал стат данные, это количество обращений и время выполнения. Пользуюсь им до сих пор, кроме очень сложных запросов к базе.
Класс изображений обеспечивал (он принимал как одно, так и массив изображений): ресайз изображений, перемещение, crop, отдачу статданных по цветности, цветам, заполненности, перевод изображения в ч/б, добавление watermark, добавление различных элементов и даже начал писать обработчик-аппроксиматор функций. В принципе по сложности и углубленности в понимании ООП он не отличается от первого, но в дальнейшем я не изменяя этого класса, написал класс-наследник, который обрабатывал все типы изображений. Сделал это только для того, чтобы попробовать наследование ручками, на самом деле помогло не рыться в старом коде, а просто зная подход, чуть чуть подкорректировать новый.