【问题标题】:Add a callback closure to a class constructor向类构造函数添加回调闭包
【发布时间】:2020-09-03 15:12:29
【问题描述】:

我有一门别人写的课。它为我做了很多事情,它为我做的一件事是它向外部服务发出请求。

public function makeRequest() {
   ...bunch of curl stuff here
}

所以我想做的是修改类的构造函数,以便我可以传入一个函数,并且可以在 curl 内容之后调用该函数。我来自 javascript 背景,所以我肯定做错了,但这就是我所做的:

private $requestLogger;
public function __construct(...other variables, $requestLogger = null) {
   if ($requestLogger) {
      $this->requestLogger = $requestLogger;
   }
}

public function makeRequest() {
   ...bunch of curl stuff here
   if ($this->requestLogger) {
            $curlInfo = curl_getinfo($ch);
            $this->requestLogger($curlInfo['url'], $curlInfo['http_code'], $request, $response);
   }
}

当我创建一个新实例时,我可以这样做

$client = new ApiClient(..., function($url, $responseCode, $requestText, $responseText){
   // do whatever i want here
});

但是,这没有奏效。我收到这条消息:500: Call to undefined method ApiClient::requestLogger()

如何设置自己以将回调函数传递给此类?

【问题讨论】:

  • 不确定我在哪里看到的,但你应该可以做到($this->requestLogger)(.......

标签: php callback


【解决方案1】:

当您这样做时:$this->requestLogger(...),PHP 认为您正在尝试调用名为 requestLogger() 的类方法。

如果要调用类属性中的函数,可以使用call_user_func_array()。像这样的:

call_user_func_array($this->requestLogger, [
    $curlInfo['url'], 
    $curlInfo['http_code'], 
    $request, 
    $response
]);

提示,在尝试调用它之前,请确保它包含可调用的内容,而不仅仅是空的:

if (is_callable($this->requestLogger)) {
    call_user_func_array(...);
}

【讨论】:

  • 谢谢。就在您发布此内容之前,我尝试了call_user_func($this->requestLogger, $curlInfo['url'], $curlInfo['http_code'], json_encode($parameters), $response);,它成功了。
  • @TKoL - 是的,它做同样的事情。我倾向于出于习惯使用它,因为你可以定义一个包含所有参数的数组,这样它们就可以更具动态性。但是 PHP 现在从 PHP 5.6 开始有参数解包(splat 运算符),这两种方式都可以解决。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
相关资源
最近更新 更多