【问题标题】:How to pass class instance scope to callback function?如何将类实例范围传递给回调函数?
【发布时间】:2016-06-14 09:27:36
【问题描述】:

我正在重写我编写的 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 实例的引用。

【问题讨论】:

    标签: php methods scope callback this


    【解决方案1】:

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

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

    【讨论】:

    • 有没有办法隐含地做到这一点而不将其传递给函数?顺便说一句,谢谢你的回答。
    • 据我所知,这是在 PHP 中访问父作用域的唯一方法。
    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2016-03-02
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多