Chyba nie ma innego sposobu (w programowaniu strukturalnym oczywiście), jak wykorzystanie możliwości buforowania wyjścia w taki oto sposób:
<?php
function update_html($html, $page_title) {
return str_replace('<!-- #PAGE_TITLE# -->', $page_title, $html); }
?>
<html>
<head>
<title><!-- #PAGE_TITLE# --></title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="description" content="desc" />
<meta name="keywords" content="key" />
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body>
<?php
$page = isset($_GET['mdl'] && $_GET['mdl'] != '') ?
$_GET['mdl'] : 'index'; include(DIR . $page . '.php'); // wewnątrz pliku pages/$page.php deklarujemy zmienną $page_title, której wartością jest tytuł strony pobrany z bazy danych
}
?>
</body>
</html>
<?php
echo update_html
($html, $page_title); // zmienna $page_title została zadeklarowana w include-owanym pliku, ale w tym miejscu jest widoczna ?>
W HTML tworzymy sobie takie pseudo zmienne (tutaj <!-- #PAGE_TITLE# -->), które
przed samym wyświetleniem właściwego dokumentu HTML zastępujemy zmiennymi PHP. Pokazałem to na przykładzie tytułu, ale wcale nie musimy się do tego ograniczać. Tak mniej więcej działają systemy szablonów z tą różnicą, że w systemach szablonów do szablonu przekazuje się tylko niezbędne dane i pomija się całkowicie logikę aplikacji.
Zastanowiłbym się jednak nad tym, czy to rozwiązanie jest konieczne i czy nie można całości zorganizować inaczej, tzn. tak, aby wszystkie zmienne potrzebne w include-owanym pliku przygotować wcześniej (w sumie to tak działają kontroler-widok w MVC, chociaż mogą mieć o wiele większe możliwości).