[英]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.