Php 我得到这个错误;函数名必须是字符串";

Php 我得到这个错误;函数名必须是字符串";,php,Php,我有一个PHP类,其中一个私有成员是对我的日志函数的回调(即在PHP语言中,函数指针只是一个包含要调用的函数名称的字符串) 我得到这个错误: 致命错误:函数名必须是字符串 self::$logferr等于“msgfunc”,这是我的日志函数 如果我像这样重写代码(在同一个类方法上): 它可以工作,log函数被调用只需将变量括在括号中,让PHP先解析值: (self::$logferr)($res); 只需将变量括在括号中,让PHP先解析值: (self::$logferr)($res); 您

我有一个PHP类,其中一个私有成员是对我的日志函数的回调(即在PHP语言中,函数指针只是一个包含要调用的函数名称的字符串)

我得到这个错误:

致命错误:函数名必须是字符串

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);