Есть несколько подходов чтобы избавиться от дублирования.
инклуды, вызовы функций для отрисовки футера-хедера.
лэйауты, когда подключается сразу весь основной шаблон, а динапическая часть инклудится или вставляется.
и наследование как в современных шаблонизаторах, при этом как при ООП кодходе, всё можно переопределять.