向 class 构造函数添加回调闭包
Add a callback closure to a class constructor
我有一个 class 是别人写的。它为我做了很多事情,它为我做的一件事是它向外部服务发出请求。
public function makeRequest() {
...bunch of curl stuff here
}
所以我想做的是修改 class 的构造函数,这样我就可以传入一个函数,并且可以在 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()
如何设置自己将回调函数传递给此 class?
当您执行以下操作时:$this->requestLogger(...)
,PHP 认为您正在尝试调用名为 requestLogger()
.
的 class 方法
如果要调用class属性中的函数,可以使用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(...);
}
我有一个 class 是别人写的。它为我做了很多事情,它为我做的一件事是它向外部服务发出请求。
public function makeRequest() {
...bunch of curl stuff here
}
所以我想做的是修改 class 的构造函数,这样我就可以传入一个函数,并且可以在 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()
如何设置自己将回调函数传递给此 class?
当您执行以下操作时:$this->requestLogger(...)
,PHP 认为您正在尝试调用名为 requestLogger()
.
如果要调用class属性中的函数,可以使用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(...);
}