2016-06-14 19 views
0

私が書いたMVCフレームワークを書き直し中です。フレームワークのデフォルトのルーティング動作に加えて明示的なルーティングを組み込むことに決めましたが、問題があります。クラスインスタンススコープをコールバック関数に渡すにはどうすればいいですか?

これは、このISN ...私は悩みを抱えているところです...(それはAppクラスのメソッドです)

$app = new App; 

    $app->all("/", function() { 
    $controller = $app->setController("test"); 
    if ($controller) 
    { 
     $app->controller->index(); 
    } 
    else 
     echo $controller; 
    }); 

private function executeRoute($requestType, $route, $callback) 
    { 
     if (is_array($requestType)) 
     { 
     if (in_array($_SERVER['REQUEST_METHOD'], $requestType)) 
      $matched = true; 
     else 
      $matched = false; 
     } 
     else if (($_SERVER['REQUEST_METHOD'] == $requestType) || ($requestType == "ALL")) 
     $matched = true; 
     else 
     $matched = false; 
     if ($matched) 
     { 
     $uriVariables = $this->getUriVariables($route, implode("/", $this->uri)); 
     if (is_array($uriVariables)) 
      call_user_func_array($callback, $uriVariables); 
     } 
    } 

ルートを実行する方法であり、コールバック関数に自分のスコープがあり、私のAppクラスのインスタンスが含まれていないため、作業していません。開発者が明示的に彼のAppインスタンスを依存関係/引数としてコールバック関数に追加することなく、コールバック関数への参照を渡す方法はありますか?

$appをコールバックの内側に使用したい場合は、$thisAppインスタンスへの参照に書き換えてください。

答えて

2

親スコープから変数を継承するには、useを使用する必要があります。

$app = new App; 

$app->all("/", function() use ($app) { 
    $controller = $app->setController("test"); 
    if ($controller) 
    { 
     $app->controller->index(); 
    } 
    else 
     echo $controller; 
}); 
+0

これを関数に渡すことなく暗黙的に行う方法はありますか?ところで、答えをありがとう。 – Allenph

+0

私が知る限り、これはPHPの親スコープにアクセスする唯一の方法です。 –

関連する問題