2016-06-14 1 views
0

필자가 작성한 MVC 프레임 워크를 다시 작성하는 중입니다. 프레임 워크의 기본 라우팅 동작 외에도 명시 적 라우팅을 통합하기로 결정했지만 문제가 있습니다. 클래스 인스턴스 범위를 콜백 함수에 전달하는 방법은 무엇입니까?

이 경로를 실행하는 방법입니다 ... 제가하는 데 문제가 어디에

다음
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 = new App; 

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

이 ISN (그것은 App 클래스의 방법이다) 콜백 함수가 내 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에서 상위 범위에 액세스하는 유일한 방법입니다. –

관련 문제