我正在重写我写过的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
实例的引用。
答案 0 :(得分:2)
您需要使用use从父作用域继承变量。
$app = new App;
$app->all("/", function() use ($app) {
$controller = $app->setController("test");
if ($controller)
{
$app->controller->index();
}
else
echo $controller;
});