PHP包括最佳实践问题

时间:2010-09-05 01:12:03

标签: php include

我一直在学习PHP的语法并练习它。我来自.NET背景,所以当页眉和页脚出现时,masterpages总是让我很容易。

到目前为止,我有一个mainHeader.php和mainFooter.php,它有我的头部菜单和我的页脚html。我创建了一个mainBody.php,在顶部我放了

<?php include "mainHeader.php" ?>

和我放的页脚

<?php include "mainFooter.php" ?>

这完美地工作,让我微笑,因为我的网页很好地融合在一起。 mainHeader有<html><body>,我的mainFooter有我的结束标记。

这是好习惯吗?

10 个答案:

答案 0 :(得分:49)

我从控制器中包含了我的观点。我还定义了文件位置,以便于维护。

<强>的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 );

答案 1 :(得分:5)

你也可以反过来做。有一个带页眉/页脚的主页,只包含正文。

<!DOCTYPE html>
<html lang="en">
    <head>
        ...
    </head>
    <body>
        <?php include $page ?>
    </body>
</html>

答案 2 :(得分:3)

现在的好习惯是使用模板引擎,例如smarty。对于整个应用程序,请考虑使用framework,例如codeigniter

答案 3 :(得分:3)

在您开始使用“视图”或“模板”之前,您所做的是正常的,在这种情况下,您不再将内容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>

答案 4 :(得分:3)

总结以上所有内容 这是使用的好方法,但不要忘记使用页面内容的模板页面。

部分基于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 ?>

答案 5 :(得分:0)

这是一个非常好的方法,只要您的网站不超过20页阈值。然而,我建议在函数样式中使用include(),而不是构造,并将这些模板放在单独的子文件夹中。如果其中没有PHP代码,也可以使用.htm文件扩展名(htm指定部分html)。

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

这种方法的缺点是,你最终会通过全局变量将HTML注入其中。 $HEAD='<link...>'; include("../header.htm")。这本身并不坏,但可以很快积累起来。

答案 6 :(得分:0)

我喜欢使用函数来打印页眉和页脚而不是包含。您可以通过这种方式更好地调整变量范围。

答案 7 :(得分:0)

对于小型网站,include / include_once和require / require_once都很棒,多年来我没有建立一个没有它们的网站。但是,我建议确保每个包含文件都是一个有效XML的离散代码块。我的意思是不要在一个包含中打开标记并在另一个包含中关闭它,反之亦然 - 它会使更改变得复杂并且更容易破坏,因为文件之间存在依赖关系。快乐的编码!

答案 8 :(得分:0)

我知道这已经很晚了,只是想在这个问题上加上我的“便士价值”。

我的建议是为此创建方法,例如我的根目录是: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();

?>

答案 9 :(得分:0)

公认的答案是2010年表格,在过去十年中情况发生了变化。

现在的方法是composer取代了大多数手动有线自动装带器,最佳实践是在已知的固定位置使用单个require_once,利用脚本中的__DIR__

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

使用define()不再常见。

根据环境不可知方法,使用.env或类似方法将来自环境的依赖项注入到应用程序中。