2011-12-04 2 views
7

I持って、次のクラス:私は、テンプレートで使用できるTheView::$variables(各項目のキーですべての変数を作ることができますどのようにテンプレートで変数を使用する方法は?

<?php 
echo $Message; 
?> 

abstract class TheView 
{ 
    public $template = NULL; 
    public $variables = array(); 

    public function set($name, $value) 
    { 
    $this->variables[$name] = $value; 
    } 
    public function display() 
    { 
    include($this->template); 
    } 
} 

テンプレートファイルは、単純なPHPファイルです変数の名前でなければなりません)。

私は既にすべての変数を$GLOBALSに追加しようとしましたが、それはうまくいかなかった(と私はそれが悪い考えだと思う)。

答えて

5

私はいつもこれやって終わる:

public function render($path, Array $data = array()){ 
    return call_user_func(function() use($data){ 
     extract($data, EXTR_SKIP); 
     ob_start(); 
     include func_get_arg(0); 
     return ob_get_clean(); 
    }, $path); 
} 

注意無名関数とfunc_get_arg()コールを。私は$thisと他の変数 "pollution"がテンプレートに渡されないようにそれらを使用します。含める前に$dataの設定を解除することもできます。

$thisを利用できるようにしたい場合は、方法から直接extract()include()としてください。

だから、次のことができます。

$data = array('message' => 'hello world'); 
$html = $view->render('path/to/view.php', $data); 

path/to/view.phpで:あなたはViewオブジェクトはなく、render()法の適用範囲から、合格したい場合は、次のように、それを変える

<html> 
    <head></head> 
    <body> 
     <p><?php echo $message; ?></p> 
    </body> 
</html> 

public function render($path, Array $data = array()){ 
    return call_user_func(function($view) use($data){ 
     extract($data, EXTR_SKIP); 
     ob_start(); 
     include func_get_arg(1); 
     return ob_get_clean(); 
    }, $this, $path); 
} 

$viewがViewオブジェクトのインスタンスになります。それはテンプレートで利用可能ですが、render()メソッド(の保護外ののカプセル化を保持する

+0

ありがとう、うまくいきます! – user897029

+0

私は** - 1 **を見ます。なぜ好奇心が強い?あなたは何が違うのですか、謎 - ** 1 **? – Dan

+0

私は-1を見ていない、彼/彼女は彼の意見を変更しました;) – user897029

3

あなたはextract()を使用することができます:あなたは、現在のシンボルテーブルに列から変数をインポートするextract機能を使用することができます

foreach($variables as $key => $value){ 
    $$key = $value; 
} 
+0

の範囲外からであるので、公開メンバーだけが公開されます。しかし、$ this以外のビュー変数をインクルードするだけであれば、より洗練されたものになると思います。 – user897029

0

はこれを試してみてください。

abstract class TheView 
{ 
    public $template = NULL; 
    public $variables = array(); 

    public function set($name, $value) 
    { 
    $this->variables[$name] = $value; 
    } 
    public function display() 
    { 
    extract($this->variables); 
    include($this->template); 
    } 
} 
+1

これは 'extract($ variables、EXTR_OVERWRITE);と同じです。 – user897029

+0

ああ、大丈夫です!私はまだPHPのすてきな機能をすべて知りません。 – ThatOtherPerson

+0

私は 'extract()'について聞いたことがありますが、私の問題を解決したことはありませんでした。それはプログラマーの人生です - いつもやって学ぶ;) – user897029

0

public function display() 
{ 
    extract($this->variables); 
    include($this->template); 
} 
関連する問題