2017-06-01 8 views
1

ブロックのクラスからレンダリングされる、ある種のブロックレンダラーを実行しています。私は$ thisを使用してブロックをビューから保護することを禁止したいからです。

class Test 
{ 
    function __construct() 
    { 
     $data["somedata"] = [1,2,3,4]; 
     $this->render("view.php", $data); 
    } 

    protected function render($file, $data = []) 
    { 
     $func = $this->closedRender($file, $data); 
     $func(); 
    } 

    protected function closedRender($file, $data) 
    { 
     return function() use ($file, $data) { 
     ### Here if I use $this I gent instance of "Test" what I don't want 
      extract($data); 
      require $file; 
      }; 
    } 
} 

どのようにすればいいですか?人々は通常、反対を達成したいと思うし、私は自分の状況に答えを見つけることができませんでしたので、

+0

のようになりますどの変数を設定するかを自由に制御できます。 – Barmar

+0

私は抽出物を使用しません、これは簡単なドラフトです。 $ thisは定義されており、オブジェクトのインスタンスです。私が見る方法は、クラス内にないグローバル関数を定義することです。しかし、何らかの方法があれば、私はクラス内でこの機能を持つことができるのが好きです。 –

答えて

2

この方法を使用することができます。注staticReference

に無名関数を定義する:PHP 5.4のとおり、無名関数を静的に宣言することができます。静的関数で

return static function() use ($file, $data) 
{ 
    extract($data); 
    require $file; 
}; 

、あなたが取得するprint_r($this)使用しようとします。

お知らせ:未定義の変数:この

あなたの全体のコードは、これは `抽出()は`一般的に悪い考えですなぜ、あなたは「ドンである。この

class Test 
{ 

    function __construct() 
    { 
     $data["somedata"] = [1, 2, 3, 4]; 

     $this->render("view.php", $data); 
    } 

    protected function render($file, $data = []) 
    { 
     $func = $this->closedRender($file, $data); 
     $func(); 
    } 

    protected function closedRender($file, $data) 
    { 
     return static function() use ($file, $data) 
     { 
      extract($data); 
      require $file; 
     }; 
    } 

} 
+1

これは機能します。どうもありがとうございました。私は後で答えを受け入れるでしょう、今すぐできません –

+0

@ErikKubicaようこそ... :)問題はありません。 –

関連する問題