21 ошибка программиста PHP. Часть 1 - Клиентская часть программы не отделяется от серверной части

ОГЛАВЛЕНИЕ

16. Клиентская часть программы не отделяется от серверной части

Многие программисты рекомендуют объединять код HTML (интерпретируемый на стороне клиента) и код PHP (выполняемый сервером) в один большой файл.

Для маленьких сайтов это, возможно, неплохо. Но, когда ваш сайт начнет расти, вы можете столкнуться с проблемами при необходимости добавить какие-либо новые функции. Такой стиль программирования приводит к очень "непослушному" и громоздкому коду.

API функции

Если вы собрались отделить код PHP от HTML кода, у вас есть два варианта. Один способ - - создать функции динамического формирования вывода и поместить их в нужное место на веб-странице.

Например, так:

index.php - код страницы

<?php include_once ("site.lib"); ?>
<html>
<head>
<title>
<?php print_header (); ?></title>
</head>
<body>
<h1>
<?php print_header (); ?></h1>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="25%">

<?php print_links (); ?>
</td>
<td>

<?php print_body (); ?>
</td>
</tr>
</table>
</body>
</html>

site.lib - Сам код программы


<?php

$dbh = mysql_connect ("localhost""sh", "pass")
or die (sprintf ("Не могу открыть соединение с MySQL [%s]: %s",
mysql_errno (), mysql_error ()));

@mysql_select_db ("MainSite")
  or die (sprintf ("Не могу выбрать базу данных [%s]: %s",
mysql_errno (), mysql_error ()));

$sth = @mysql_query ("SELECT * FROM site", $dbh)
or die (sprintf ("Не могу выполнить запрос [%s]: %s",
mysql_errno (), mysql_error ()));

$site_info = mysql_fetch_object ($sth);

function print_header ()
{
global $site_info;
print $site_info->header;
}

function print_body ()
{
global $site_info;
print nl2br ($site_info->body);
}

function print_links ()
{
global $site_info;

$links = explode ("\n", $site_info->links);
$names = explode ("\n", $site_info->link_names);

for ($i = 0; $i < count ($links); $i++)
{
print "\t\t\t
<a href=\"$links[$i]\">$names[$i]</a>
\n<br>\n";
}
}
?>

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

Плюсы использования API функций

  • Относительно чистый, ясный код
  • Быстрый код

Минусы использования API функций

  • Не настолько наглядно как система шаблонов
  • Все-таки для модификации дизайна требуется некоторое знание PHP

Система шаблонов

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

Пример использования шаблонов:

<html>

<head>
<title>
%%PAGE_TITLE%%</title>
</head>

<body
%%BODY_PROPERTIES%%>
<h1>
%%PAGE_TITLE%%</h1>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="25%">
%%PAGE_LINKS%%</td>
<td>
%%PAGE_CONTENT%%</td>
</tr>
</table>
</body>

</html>

Затем пишем программу, просматривающую код шаблона и при выводе заменяющую тэги вида %%SOME%% нужной информацией.

Примечание: неплохой класс для использования его в системе шаблонов - FastTemplate, его можно скачать с http://www.thewebmasters.net/.

Плюсы использования шаблонов:

  • Предельно просто и ясно
  • Для изменения шаблонов не требуется знание PHP

Минусы использования шаблонов:

  • Более медленный способ - ведь надо сканировать весь шаблон и лишь потом выводить данные
  • Сложнее внедрить на практике