PHP включает вопрос о лучших практиках
Я изучал синтаксис PHP и практиковался в нем. Я родом из .NET-среды, поэтому мастер-страницы всегда облегчали мне задачу, когда дело касалось верхних и нижних колонтитулов.
До сих пор у меня есть mainHeader.php и Мейнфутер.php, в котором есть мое главное меню и мой нижний колонтитул html. Я создал mainBody.php и вверху я поставил
<?php include "mainHeader.php" ?>
И для нижнего колонтитула я поставил
<?php include "mainFooter.php" ?>
Это сработало идеально и заставило меня улыбнуться, потому что все мои страницы хорошо сочетались. то В главном заголовке есть мои <html>
и <body>
, а в моем главном заголовке есть мои закрывающие теги для них.
Является ли это хорошей практикой?
9 answers
Я включаю свои представления от своих контроллеров. Я также определяю расположение файлов, чтобы упростить обслуживание.
Config.php
define('DIR_BASE', dirname( dirname( __FILE__ ) ) . '/');
define('DIR_SYSTEM', DIR_BASE . 'system/');
define('DIR_VIEWS', DIR_SYSTEM . 'views/');
define('DIR_CTLS', DIR_SYSTEM . 'ctls/');
define('DIR_MDLS', DIR_SYSTEM . 'mdls/');
define('VIEW_HEADER', DIR_VIEWS . 'header.php');
define('VIEW_NAVIGATION', DIR_VIEWS . 'navigation.php');
define('VIEW_FOOTER', DIR_VIEWS . 'footer.php');
Теперь у меня есть вся необходимая информация, просто включив config.php
.
Controller.php
require( '../config.php' );
include( DIR_MDLS . 'model.php' );
$model = new model();
if ( $model->getStuff() ) {
$page_to_load = DIR_VIEWS . 'page.php';
}
else {
$page_to_load = DIR_VIEWS . 'otherpage.php';
}
include( VIEW_HEADER );
include( VIEW_NAVIGATION );
include( DIR_VIEWS . $page_to_load );
include( VIEW_FOOTER );
Вы также можете сделать это наоборот. Имейте главную страницу с верхним/нижним колонтитулом и включайте только тело.
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<?php include $page ?>
</body>
</html>
В настоящее время хорошей практикой является использование механизма шаблонов, такого как smarty. Для всего приложения рассмотрите возможность использования фреймворка, например codeigniter.
То, что вы делаете, нормально до тех пор, пока вы не начнете использовать "Представления" или "Шаблоны", и в этом случае вы больше не будете размещать свой HTML-код содержимого внутри запущенного "контроллера" или "действия".
Вместо этого вы загрузите представление и заполните его значениями, которые оставят весь исходный код HTML для представления, а не для вашего PHP-файла.
$view = new View('layout.php');
$view->header = $header;
$view->content = 'This is the main content!';
$view->footer = $footer;
print $view;
, который затем загружает файл макета, который выглядит примерно так:
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<div id="header"><?php print $header; ?></div>
<div id="content"><?php print $content; ?></div>
<div id="footer"><?php print $footer; ?></div>
</body>
</html>
Резюмируя все вышесказанное.
Это хороший способ использовать includes, но не забывайте использовать страницу шаблона для содержимого страницы.
Частично основано на Галене и Балусе:
page.php
require $_SERVER['DOCUMENT_ROOT'].'/../config.php';
$data = get_data(); // assume we get all required data here.
$pagetitle = "This is a sample page";
$template = "page.tpl.php";
include "main.tpl.php";
main.tpl.php
<!DOCTYPE html>
<html lang="en">
<head>
<title><?php echo $pagetitle?></title>
</head>
<body>
<?php include $template ?>
</body>
</html>
page.tpl.php
что-то вроде этого:
<h1><?php echo $pagetitle?></h1>
<?php if (!$data): ?>
No news yet :-(
<?php else: ?>
<ul>
<? foreach ($data as $row): ?>
<li><a href="news.php?id=<?php echo $row['name']?>"><?php echo $row['name']?></a></li>
<?php endforeach ?>
</ul>
<?php endif ?>
Это отличный метод, если только ваш сайт не превысит порог в 20 страниц. Однако я бы посоветовал использовать include() в стиле функции, а не как конструкцию, и поместить эти шаблоны в отдельную подпапку. Если в них нет кода PHP, также используйте расширение файла .htm (htm, обозначающее частичный html).
include("template/main/header.htm"); // would still parse PHP code!
Недостатком этого подхода является то, что вы когда-нибудь в конечном итоге вводите в него HTML через глобальные переменные. $HEAD='<link...>'; include("../header.htm")
. Что само по себе неплохо, но может быстро накапливайте крафт.
Мне нравится использовать функции для печати верхних и нижних колонтитулов вместо включений. Таким образом, вы можете лучше настроить область действия переменной.
Для небольших сайтов отлично подходят include/include_once и require/require_once, я годами не создавал сайт без них. Однако я бы рекомендовал убедиться, что каждый из ваших включенных файлов представляет собой отдельный блок кода, который является допустимым XML. Я имею в виду, что не открывайте тег в одном приложении и не закрывайте его в другом, или наоборот - это усложнит изменения и сделает их более подверженными нарушениям, потому что у вас есть зависимости между файлами. Счастливого кодирования!
Я знаю, что уже очень поздно, просто хотел добавить свои "копейки" к этому вопросу.
Я бы предложил создать методы для этого, например, мой корень: var/www/htdocs/, а файл функций находится в includes/functions/template-parts.php .
Мои функции выглядели бы так:
<?php
define("DOC_ROOT", "/var/www/htdocs/"); # Add a trailing slash to make it a little easier
function GetHeader()
{
return include DOC_ROOT . 'includes/parts/header.htm'; # Header found at include/parts/header.htm
}
function GetFooter()
{
return include DOC_ROOT . 'includes/parts/footer.htm'; # Footer found at include/parts/footer.htm
}
?>
И используется как таковой:
<?php
# From the main page (/var/www/htdocs/index.php)
require_once 'includes/functions/template-parts.php';
GetHeader();
?>
<!-- Page content -->
<?php
GetFooter();
?>