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


Pass Method/Function as Argument and Invoke

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

我正在尝试将 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

您错误

地使用了可调用提示。根据文档:

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

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

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

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

但是,在您的情况下,正如其他答案所述,除非您所做的不仅仅是在handle_request中调用redirect或有以这种方式传递回调的特定要求,否则您可能最好只是将$app传递给handle_request并让它用$app本身做它需要的事情。这是一个更好的 OO 模式。

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

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

希望这对:)有所帮助