我有一个PHP类,其中私有成员之一是我的日志函数的回调(即,在PHP领域中,函数指针只是一个包含要调用的函数名称的字符串)。
self::$logferr = "msgfunc";
self::$logferr($res);
我收到此错误:
致命错误:函数名称必须是字符串
self::$logferr
等于"msgfunc"
,这是我的日志功能。
如果我这样重写代码(使用相同的类方法):
$tmp = "msgfunc";
$tmp($res);
它起作用了,日志函数被调用
答案 0 :(得分:4)
答案 1 :(得分:1)
答案 2 :(得分:1)
您可以使用call_user_func
。参考:this
call_user_func(self::$logferr, $res);
答案 3 :(得分:0)
让我们建立一个可复制的示例:
class Foo {
private static $_loggerCallback;
static function setLogCallback(callable $loggerCallback) {
self::$_loggerCallback = $loggerCallback;
}
static function log(...$arguments) {
if (NULL !== self::$_loggerCallback) {
return self::$_loggerCallback(...$arguments);
}
return NULL;
}
}
Foo::setLogCallback(function() { echo 'success'; } );
Foo::log();
输出:
Notice: Undefined variable: _loggerCallback in /in/f3stL on line 13
Fatal error: Uncaught Error: Function name must be a string in /in/f3stL:13
在这种情况下,通知将报告实际错误。如果没有得到类似的信息,则应检查错误报告配置。
该通知表明PHP正在寻找局部变量$_loggerCallback
。它尝试执行$_loggerCallback(...$arguments)
。这有多种使呼叫明确的方法。
使用括号(PHP> = 7.0):
return (self::$_loggerCallback)(...$arguments);
使用局部变量(如您所做的那样):
$callback = self::$_loggerCallback;
return $callback(...$arguments);
一个小建议。 PHP支持匿名函数。您不需要(全局)函数进行回调。这样也避免了通过名称调用函数。