Php 我得到这个错误;函数名必须是字符串";
我有一个PHP类,其中一个私有成员是对我的日志函数的回调(即在PHP语言中,函数指针只是一个包含要调用的函数名称的字符串) 我得到这个错误: 致命错误:函数名必须是字符串Php 我得到这个错误;函数名必须是字符串";,php,Php,我有一个PHP类,其中一个私有成员是对我的日志函数的回调(即在PHP语言中,函数指针只是一个包含要调用的函数名称的字符串) 我得到这个错误: 致命错误:函数名必须是字符串 self::$logferr等于“msgfunc”,这是我的日志函数 如果我像这样重写代码(在同一个类方法上): 它可以工作,log函数被调用只需将变量括在括号中,让PHP先解析值: (self::$logferr)($res); 只需将变量括在括号中,让PHP先解析值: (self::$logferr)($res); 您
self::$logferr
等于“msgfunc”
,这是我的日志函数
如果我像这样重写代码(在同一个类方法上):
它可以工作,log函数被调用只需将变量括在括号中,让PHP先解析值:
(self::$logferr)($res);
只需将变量括在括号中,让PHP先解析值:
(self::$logferr)($res);
您应该使用
self::{self::$logferr}($req)
工作示例:您应该使用
self::{self::$logferr}($req)
工作示例:让我们构建一个可复制的示例:
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查找局部变量$\u loggerCallback
。它尝试执行$\u loggerCallback(…$参数)
。这里有不同的可能性使调用明确
使用括号(PHP>=7.0):
使用局部变量(如您所做的):
一个小小的建议。PHP支持匿名函数。回调不需要(全局)函数。这也避免了按名称调用函数 让我们构建一个可复制的示例:
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查找局部变量$\u loggerCallback
。它尝试执行$\u loggerCallback(…$参数)
。这里有不同的可能性使调用明确
使用括号(PHP>=7.0):
使用局部变量(如您所做的):
一个小小的建议。PHP支持匿名函数。回调不需要(全局)函数。这也避免了按名称调用函数 您可以使用
调用用户函数
。参考:
您可以使用
call\u user\u func
。参考:
有可能看到这个类吗?试试这个?最小可验证的例子?另外,我不鼓励通过字符串调用这种方法,除非你正在设计一个框架。调试时会产生很多混乱,比如传递什么数据以及调用哪个方法。@Gianluca Ghettini我发布了答案。是否可以看到类?试试这个?最小的可验证示例?此外,除非您正在设计框架,否则我不鼓励通过字符串调用此类方法。调试时会产生很多混乱,比如传递什么数据以及调用哪个方法。@Gianluca Ghettini我将给出答案。
call_user_func(self::$logferr, $res);