如何将类实例范围传递给回调函数?

时间:2016-06-14 09:27:37

标签: php methods scope callback this

我正在重写我写过的MVC框架。除了我的框架的默认路由行为之外,我还决定合并显式路由,但我遇到了问题。

这是执行路线的方法(它是App类的方法)...

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;
  });

这不起作用,因为回调函数有自己的范围,不包含我的App类的实例。有没有办法在没有开发人员明确地将他的App实例作为依赖/参数添加到回调函数的情况下传递对回调函数的引用?

我希望能够在回调中使用$app,或者将$this重写为对App实例的引用。

1 个答案:

答案 0 :(得分:2)

您需要使用use从父作用域继承变量。

$app = new App;

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