我收到此错误“函数名称必须为字符串”

时间:2019-10-10 09:40:18

标签: php

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

self::$logferr = "msgfunc";
self::$logferr($res);

我收到此错误:

  

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

self::$logferr等于"msgfunc",这是我的日志功能。

如果我这样重写代码(使用相同的类方法):

$tmp = "msgfunc";
$tmp($res);

它起作用了,日志函数被调用

4 个答案:

答案 0 :(得分:4)

只需将变量包装在括号中,让PHP首先解析该值:

(self::$logferr)($res);

Proof of concept

答案 1 :(得分:1)

您应该使用来调用它

 self::{self::$logferr}($req)

工作示例:https://3v4l.org/CYURS

答案 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支持匿名函数。您不需要(全局)函数进行回调。这样也避免了通过名称调用函数。