Zum Thema index.php?content=start vs. start.php:

Ob du jetzt in der index.php ne Abfrage machst, ob $content === "start" oder ob du in der start.php einfach nur den Kram hast, der nach der Abfrage ausgeführt würde, kommt ja dann aufs gleiche raus.

Mit Jeez' Variante könnte man etwa so verfahren:
contact.php
PHP-Code:
<?php 
$template 
file_get_contents('res/base.hic'); 
$body file_get_contents('res/contact.inc'); 
$template str_replace('{body}'$body$template); 
?>
about.php
PHP-Code:
<?php 
$template 
file_get_contents('res/base.hic'); 
$body file_get_contents('res/about.inc'); 
$body str_replace('{time}'date('H:i:s'), $body); 
$template str_replace('{body}'$body$template); 
?>
Das hat zwar den Nachteil, dass ein paar Zeilen doppelt sind, aber dafür hat man ordentliche Links.

Übrigens noch ein kleines Beispiel, wie das mit Mannis Klasse aussehen könnte:

start.tpl (Endung kann natürlich auch anders sein)
HTML-Code:
<html>
  <head>
    <title>{title}</title>
  </head>
  <body>
    <INCLUDE! navigation.tpl>
    <div>{text}</div>
  </body>
</html>
navigation.tpl
HTML-Code:
    <ul>
      <BLOCK! navigation>
      <li><a href="{navigation.href}">{navigation.name}</a></li>
      </BLOCK!>
    </ul>
start.php
PHP-Code:
<?php
  
include "template.class.php";
  include 
"setup_template.php";
  include 
"navigation.php";

  
$template->set_variable(array("title" => "Start""text" => "Lorem Ipsum"));
  
  
$template->parse("start");
?>
setup_template.php
PHP-Code:
<?php
  $template 
= new Template('templates/''templates/cached/');
  
  
$templatedir dir($template->path);
  while((
$filename $templatedir->read()) !== false)
  {
    if(
preg_match('#^(.*?)\.tpl$#i'$filename$m))
    {
      
$templates[$m[1]] = $filename;
    }
  }
  
$template->setfile($templates);
?>
navigation.php
PHP-Code:
<?php
  $navigation 
= array();
  
$navigation[] = array("href" => "start.php""name" => "Start");
  
$navigation[] = array("href" => "downloads.php""name" => "Downloads");
  
$template->set_block_variable("navigation"$navigation);
?>
Dazu drei Anmerkungen:
  1. Es sieht mit den vielen Dateien ziemlich umständlich aus, aber davon muss man pro Seite nur zwei (z.B. start.tpl und start.php) schreiben
  2. Die setup_template.php kann man sich sparen, indem man nur die Templates lädt, die man braucht, aber ich lass aus Bequemlichkeit immer alle laden, die sich im entsprechenden Verzeichnis befinden.
  3. Mannis Klasse erlaubt foreach-Schleifen (<BLOCK!>), Bedingungen (<IF!>, <ELSE!>) und Includes (<INCLUDE!>) und ist damit sehr flexibel.