2012-03-21 13 views
1

ob_get_contents()をコアメソッドとして使用して独自のテンプレートスクリプトを作成しています。それを使用すると、1つのファイルから呼び出して、他のファイルをレンダリングすることができます。 (PHP)以前のINCLUDE/REQUIRE呼び出しを子ファイルに渡すにはどうすればいいですか?

index.phpが呼び出す

  • のindex.php
  • header.html
  • footer.html
  • のfunctions.php:

    は同じように、私たちは4つのファイルを持っていると仮定することができます他のファイル(ここでは2つのhtmlファイル)の内容をレンダリングします。以下のコードを使用することにより:

    //index.php 
    function render($file) { 
        if (file_exists($file)) { 
        ob_start(); 
        include($file); 
        $content = ob_get_contents(); 
        ob_end_clean(); 
        return $content; 
        } 
    } 
    echo render('header.html'); 
    echo render('footer.html'); 
    

    をしかしheader.htmlがコールinclude('functions.php')、インクルードファイル(のfunctions.php)が含まれている場合(例えば)はfooter.htmlで再度使用することはできません。私は、footer.htmlに再度インクルードする必要があります。したがって、ここでは、include('functions.php')という行は両方のファイルに含まれている必要があります。

    include()子ファイルからもう一度ファイルを呼び出さないでファイル

答えて

1

ob_start()(出力バッファリング)を使用すると、ファイルの出力のみで終了します。つまり、実行されたファイルは、ob_get_content()によって返されます。出力のみが返されるので、他のファイルはインクルードを認識しません。

答えは、出力バッファリングではできません。 ob_startより前のファイルincludeinclude_onceとしてください。

//index.php 
function render($file) { 
    if(!isset($GLOBALS['included'])) { 
     $GLOBALS['included'] = array(); 
    } 

    if (!in_array($file, $GLOBALS['included']) && file_exists($file)) { 
     ob_start(); 
     include($file); 
     $content = ob_get_contents(); 
     ob_end_clean(); 

     $GLOBALS['included'][] = $file; 
     return $content; 
    } 
} 

echo render('header.html'); 
echo render('footer.html'); 

代わりにあなたがinclude_onceinclude_once $file;)を使用することができ、PHPはあなたのためにそれを行います。このような何かのように仕事ができる

+0

'include_once'で' ob_start'の前に私のファイルを含みますか?ああ、私の例では、 'index.php'の先頭に' include_once'で必要なファイルをすべて宣言すれば可能です。だから、子供たちは再び宣言する必要はありませんか? –

+1

@ 4lvinはい、もちろん可能です。最初に 'include_once'や' require_once'を使うと、すべての子ファイルに含まれている内容が表示されます。 –

+0

WOw!うん!それはシンプルで信じられないほどです!乾杯してくれてありがとうArman P. –

1

ファイルのロード構造が、こうしたイベントが起こらないような形になっていることを確認することをおすすめします。

+0

'$ GLOBALS'のやり方ではなく、' index.php'ファイルの最上位(子ファイルをレンダリングする前)に 'include_once'を1回だけ宣言できますか?知識のためにしてください。 –

+0

はいできます。しかし、ファイルが何で呼ばれても、ファイルが決して2回含まれないようにすることがさらに良い。 – sg3s

関連する問題