PHP闭包返回一个对象

PHP闭包返回一个对象,php,closures,Php,Closures,闭包允许我使用例如: $app->register('test', function() { return 'test closure'; }); echo $app->test(); 问题是,当闭包返回一个对象时,它不起作用。例如: $app->register('router', function() { return new Router(); }); $app->router->map($url, $path); 我得到:致命错误:在index.php的

闭包允许我使用例如:

$app->register('test', function() { return 'test closure'; });
echo $app->test();
问题是,当闭包返回一个对象时,它不起作用。例如:

$app->register('router', function() { return new Router(); });
$app->router->map($url, $path);
我得到:
致命错误:在index.php的第22行调用未定义的方法Closure::map()

/** app.php **/
class App {
    public function __construct(){
        $this->request = new Request();
        $this->response = new Response();
    }
    public function register($key, $instance){
        $this->$key = $instance;
    }
    public function __set($key, $val){
        $this->$key = $val;
    }
    public function __get($key){
        if($this->$key instanceof Closure){
            return $this->$key();
        }else return $this->$key;
    }
    public function __call($name, $args){
        $closure = $this->$name;
        call_user_func_array( $closure, $args ); // *
    }
}

/** router.php **/
class Router {
    public function map($url, $action){

    }  
}
插件详细信息:

是否有效:

$app->register('router', new Router());
$app->router->map($url, $action);
但是在闭包中返回一个对象的目的是根据需要提供最后一分钟的配置……我试着对此进行研究,但是大多数主题只是描述如何调用闭包,我已经理解了。这就是为什么app类中有一个调用方法

编辑:


关键是闭包返回一个闭包对象,这就是为什么它不同于“doeswork”版本

当你打电话的时候

$app->router()
\uuuu call
启动,而不是
\uuu get
,因此您将一无所获,因为您的类中没有定义可调用的路由器。我不认为有一种直接的语法来做你想做的事情,你必须通过一个temp变量,比如:

$temp = $app->router;
$temp()->map($url, $action);

实际上这是可能的…在
\u调用
方法中,我必须返回
调用用户函数数组
调用。现在,我可以使用:
$app->router()->map('url','action')根据需要。。。
$temp = $app->router;
$temp()->map($url, $action);