Well, for the real solutions site, each actual page (e.g. index.php) is all of three lines of code. One creates and sets a variable for the page title, one creates and sets a variable for the content source file, and one 'includes' a page called master.php.
master.php, however, doesn't contain the whole layout either
It contains the basic skeleton of the page, so pretty much the html, head (where it drops in the page title set in the actual page), and body elements and about three or four divs which define the overall layout. Each of those divs then contains one or more include statements to separate PHP files containing the splash header, the menu, the footer, etc... and also the content file set up in the previous page.
That way if i want to change the footer I don't have to open up a long template file and scroll to the bottom: I can just edit a file with 3 lines of html in it. And it guarantees that I don't mess up any of the rest of the template at the same time.
Anyway, that's a bit by the by, even if it'd make a nice little project for you sometime 
As to your original concept: how about having an associative array of titles to file paths, like
PHP Code:
$filepaths = array(
"about"=>"path/to/about.php",
"home"=>"path/to/home.php",
"contact"=>"path/to/contact.php"
)
Then instead of concatenating the newpage variable into the path, you could look the path and filename up in the array:
PHP Code:
filepaths[$_GET['page']])
That way if someone tried to put something sneaky into the querystring it'd simply fail to find a matching path and you could load the default page.