将方法/函数作为参数和调用传递

时间:2014-12-31 20:43:58

标签: php slim

如何将方法作为参数传递给函数,以便可以从函数中调用它?

我试图将Slim Framework的redirect()方法从路由处理程序传递给处理重定向逻辑的对象方法:

$app->get('/contact', function() use ($app) {
  $obj = new Obj;
  $obj->handle_request($app->redirect);
});

然后在对象方法中:

public function handle_request(callable $redirect) {
  $redirect('/about');
}

这给了我这个错误:Argument 1 passed to Obj::handle_request() must be callable, null given

如果我在没有callable类型提示的情况下做同样的事情,我会收到此错误:Function name must be a string

2 个答案:

答案 0 :(得分:2)

您正在使用可调用提示错误。根据{{​​3}}:

  

PHP函数的名称作为字符串传递。

     

...

     

实例化对象的方法作为数组传递,该数组包含索引为0的对象和索引为1的方法名称。

因此,在您的情况下,您需要将其作为array($app, 'redirect')传递:

$app->get('/contact', function() use ($app) {
    $obj = new Obj;
    $obj->handle_request(array($app, 'redirect'));
});

但是在你的情况下,正如其他答案所述,除非你只是在redirect中调用handle_request或者有特殊要求以这种方式传递回调,否则你可能会更好关闭只是将$app传递给handle_request,然后让它自己完成$app所需的操作。这是一个更好的OO模式。

答案 1 :(得分:1)

您可以传递$app object,然后从那里调用redirect方法。

实施例

$app->get('/contact', function() use ($app) {
  $obj = new Obj;
  $obj->handle_request($app);
});

public function handle_request($app) {
  $app -> redirect('/about');
}

希望这会有所帮助:)