AlkatraZ, вообще, если подумать, можно как то реализовать в функции template механизм определяющий место вызова этой функции, и если это шаблон, то не использовать ob_start, а если php скрипт, то использовать.
Как то так:
function template($path, array $assign = []){
static $bufferOff;
extract($assign);
// Если первый вызов, то используется ob_start
if(is_null($bufferOff)){
$bufferOff = true;
ob_start();
include($path);
return ob_get_clean();
}
// Для последующих вызовов буферизация не используется
else{
include($path);
}
}