PHP Closure возвращает объект

Закрытия позволяют мне использовать, например:

$app->register('test', function() { return 'test closure'; });
echo $app->test();

Проблема в том, что он не работает, когда замыкание возвращает объект. Как в:

$app->register('router', function() { return new Router(); });
$app->router->map($url, $path);

Я получил: Fatal error: Call to undefined method Closure::map() in index.php on line 22

/** 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);

но цель возврата объекта в замыкание состоит в том, чтобы предоставить последнюю минуту конфигурации по мере необходимости … Я попытался исследовать это, однако большинство тем просто описывают, как вызывать замыкания, что я уже понимаю. Вот почему в классе приложения есть метод __call …

Редактировать:

$app->router()->map($url, $action);
Fatal error: Call to a member function map() on null in

1

Решение

Дело в том, что замыкание возвращает объект Closure, поэтому он отличается от версии «Работает».

Также, когда вы звоните

$app->router()

__call пинает, не __get, так что вы ничего не получите, так как в вашем классе не определен вызываемый маршрутизатор. Я не думаю, что есть прямой синтаксис, чтобы делать то, что вы хотите, вы должны пройти через временную переменную, как:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]