簡體   English   中英

PHP 包含最佳實踐問題

[英]PHP include best practices question

我一直在學習 PHP 的語法並練習它。 我來自 .NET 背景,因此在頁眉和頁腳方面,母版頁總是讓我很容易。

到目前為止,我有一個 mainHeader.php 和 mainFooter.php,它們有我的頭部菜單和我的頁腳 html。 我創建了一個 mainBody.php 並在頂部放置

<?php include "mainHeader.php" ?>

對於我放的頁腳

<?php include "mainFooter.php" ?>

這非常有效,讓我微笑,因為我的頁面都很好地組合在一起。 mainHeader 有我的<html><body> ,我的 mainFooter 有我的結束標簽。

這是好的做法嗎?

我包括我的控制器的觀點。 我還定義了文件位置以使維護更容易。

配置文件

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就擁有了我需要的所有信息。

控制器.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>

在您開始使用“視圖”或“模板”之前,您所做的一切都沒有問題,在這種情況下,您不再在運行的“控制器”或“動作”中安排內容 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>

總結以上所有內容。
這是使用包含的好方法,但不要忘記為頁面內容使用模板頁面。

部分基於 Galen 和 Balus 的:

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 ?>

現在的好做法是使用模板引擎,例如smarty 對於整個應用程序,請考慮使用一個框架,例如codeigniter

對於小型站點,include/include_once 和 require/require_once 很棒,我已經很多年沒有建立沒有它們的站點了。 但是,我建議確保您的每個包含文件都是有效 XML 的離散代碼塊。 我的意思是不要在一個 include 中打開標簽並在另一個 include 中關閉它,反之亦然 - 它會使更改變得復雜並且更容易破壞事物,因為您在文件之間存在依賴關系。 快樂編碼!

公認的答案是 2010 年,過去 10 年情況發生了變化。

要走的路,現在的作曲家有取代了大多數的手有線自動加載機,最好的做法是使用一個單一的require_once利用__DIR__從一個固定的已知位置的腳本:

require_once __DIR__ . '/vendor/autoload.php';

使用define()不再常見。

根據與環境無關的方法,來自環境的依賴項使用.env或類似文件注入應用程序。

我知道這已經很晚了,只是想在這個問題上加上我的“一分錢”。

我的建議是為此創建方法,例如我的根目錄是: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();

?>

這是一個非常好的方法,只要您的網站不超過 20 頁的閾值。 然而,我建議在函數樣式中使用 include(),而不是作為構造,並將這些模板放在單獨的子文件夾中。 如果其中沒有 PHP 代碼,還可以使用 .htm 文件擴展名(htm 表示部分 html)。

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

這種方法的缺點是,您最終會通過全局變量將 HTML 注入其中。 $HEAD='<link...>'; include("../header.htm") $HEAD='<link...>'; include("../header.htm") 這本身並不壞,但可以迅速積累 cruft。

我喜歡使用函數來打印頁眉和頁腳而不是包含。 您可以通過這種方式更好地微調變量范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM