如何将方法作为参数传递给函数,以便可以从函数中调用它?
我试图将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
答案 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');
}
希望这会有所帮助:)