PHP включает вопрос о лучших практиках


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

До сих пор у меня есть mainHeader.php и Мейнфутер.php, в котором есть мое главное меню и мой нижний колонтитул html. Я создал mainBody.php и вверху я поставил

<?php include "mainHeader.php" ?>

И для нижнего колонтитула я поставил

<?php include "mainFooter.php" ?>

Это сработало идеально и заставило меня улыбнуться, потому что все мои страницы хорошо сочетались. то В главном заголовке есть мои <html> и <body>, а в моем главном заголовке есть мои закрывающие теги для них.

Является ли это хорошей практикой?

 22
Author: drpcken, 2010-09-05

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 );
 48
Author: Galen, 2018-05-16 17:31:17

Вы также можете сделать это наоборот. Имейте главную страницу с верхним/нижним колонтитулом и включайте только тело.

<!DOCTYPE html>
<html lang="en">
    <head>
        ...
    </head>
    <body>
        <?php include $page ?>
    </body>
</html>
 5
Author: BalusC, 2010-09-05 01:19:56

В настоящее время хорошей практикой является использование механизма шаблонов, такого как smarty. Для всего приложения рассмотрите возможность использования фреймворка, например codeigniter.

 3
Author: aularon, 2010-09-05 01:16:07

То, что вы делаете, нормально до тех пор, пока вы не начнете использовать "Представления" или "Шаблоны", и в этом случае вы больше не будете размещать свой 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>
 3
Author: Xeoncross, 2010-09-05 01:45:39

Резюмируя все вышесказанное.
Это хороший способ использовать 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 ?>
 3
Author: Your Common Sense, 2010-09-05 11:38:40

Это отличный метод, если только ваш сайт не превысит порог в 20 страниц. Однако я бы посоветовал использовать include() в стиле функции, а не как конструкцию, и поместить эти шаблоны в отдельную подпапку. Если в них нет кода PHP, также используйте расширение файла .htm (htm, обозначающее частичный html).

 include("template/main/header.htm");   // would still parse PHP code!

Недостатком этого подхода является то, что вы когда-нибудь в конечном итоге вводите в него HTML через глобальные переменные. $HEAD='<link...>'; include("../header.htm"). Что само по себе неплохо, но может быстро накапливайте крафт.

 0
Author: mario, 2010-09-05 01:46:38

Мне нравится использовать функции для печати верхних и нижних колонтитулов вместо включений. Таким образом, вы можете лучше настроить область действия переменной.

 0
Author: Mark Snidovich, 2010-09-05 01:51:41

Для небольших сайтов отлично подходят include/include_once и require/require_once, я годами не создавал сайт без них. Однако я бы рекомендовал убедиться, что каждый из ваших включенных файлов представляет собой отдельный блок кода, который является допустимым XML. Я имею в виду, что не открывайте тег в одном приложении и не закрывайте его в другом, или наоборот - это усложнит изменения и сделает их более подверженными нарушениям, потому что у вас есть зависимости между файлами. Счастливого кодирования!

 0
Author: siliconrockstar, 2012-08-09 18:18:33

Я знаю, что уже очень поздно, просто хотел добавить свои "копейки" к этому вопросу.

Я бы предложил создать методы для этого, например, мой корень: 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();

?>
 0
Author: Sam Swift 웃, 2015-11-17 10:08:35