web-dev-qa-db-ja.com

PHPベストプラクティスの質問を含める

私はPHPの構文を学び、それを実践してきました。私は.NETのバックグラウンドを持っているので、ヘッダーとフッターに関しては、マスターページによって常に非常に簡単になりました。

これまでのところ、ヘッドメニューとフッターhtmlを持つmainHeader.phpとmainFooter.phpがあります。 mainBody.phpを作成し、一番上に配置しました

<?php include "mainHeader.php" ?>

そして私が置いたフッターのために

<?php include "mainFooter.php" ?>

これは完璧に機能し、私のページがすべてうまくまとめられたので、私は笑顔になりました。 mainHeaderには<html><body>があり、mainFooterにはそれらの終了タグがあります。

これは良い習慣ですか?

24
ItsPronounced

コントローラーからのビューを含めます。また、メンテナンスを容易にするためにファイルの場所を定義します。

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 );
51
Galen

逆にすることもできます。ヘッダー/フッター付きのメインページを用意し、本文のみを含めます。

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

「ビュー」または「テンプレート」の使用を開始するまでは、実行中の「コントローラー」または「アクション」内にコンテンツHTMLを配置しなくなります。

代わりに、ビューをロードして値を入力し、PHPファイルではなく、すべてのHTMLソースの順序をビューに任せます。

$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
Xeoncross

最近の良い習慣は、 smarty などのテンプレートエンジンを使用することです。アプリケーション全体で、 codeigniter のように framework の使用を検討してください。

3
aularon

上記のすべてを要約します。
これはインクルードを使用するのに良い方法ですが、ページのコンテンツにテンプレートページを使用することを忘れないでください。

部分的にGalen'sand 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 ?>
3

サイトが20ページのしきい値を超えない限り、これは完全に優れた方法です。ただし、include()を構成としてではなく関数スタイルで使用し、これらのテンプレートを別のサブフォルダーに配置することをお勧めします。 PHPコードが含まれていない場合は、.htmファイル拡張子(部分的なhtmlを指定するhtm)も使用してください。

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

このアプローチの欠点は、グローバル変数を介してHTMLを挿入してしまう場合があることです。 $HEAD='<link...>'; include("../header.htm")。それ自体は悪いことではありませんが、すぐにがらくたを集めることができます。

0
mario

インクルードの代わりに関数を使用してヘッダーとフッターを印刷するのが好きです。そうすれば、変数スコープをより適切に微調整できます。

0
Mark Snidovich

小さなサイトの場合、include/include_onceとrequire/require_onceは素晴らしいです、私は何年もそれらなしでサイトを構築していません。ただし、各インクルードファイルが有効なXMLである個別のコードブロックであることを確認することをお勧めします。つまり、あるインクルードでタグを開いて別のインクルードで閉じたり、その逆を行ったりしないでください。ファイル間に依存関係があるため、変更が複雑になり、問題が発生しやすくなります。ハッピーコーディング!

0
siliconrockstar

私はこれが非常に遅いことを知っています、ただこの質問に私の「ペニーの価値」を追加したかっただけです。

私の提案は、このためのメソッドを作成することです。たとえば、私のルートはvar/www/htdocs /で、関数ファイルはincludes/features /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
Can O' Spam