0

我正在通过php回调工作。我想我已经涵盖了基础知识,但是在类扩展中工作时,我仍然在某处碰壁了一段时间,因此是时候进行一些堆栈溢出橡皮鸭编程了......!

从类扩展调用回调:

class myClass {
    function cb_check($function) {
        call_user_func($this->$function);
    }

    static function myFunction() {
        var_dump("Hello World");
    }   
}

class myExtClass extends myClass {
    function cb_invoke() {
        $this->cb_check('myFunction');
    }
}

$x = new myExtClass;
$x->cb_invoke();

错误消息(或通知和警告):

注意:未定义的属性:第 5 行 F:\test.php 中的 myExtClass::$myFunction

警告:call_user_func() 期望参数 1 是一个有效的回调,第 5 行的 F:\test.php 中没有给出数组或字符串

第5行是call_user_func()上面的。

有人知道我在这里缺少什么吗?

先感谢您!

4

3 回答 3

4

正如马克指出的那样,

call_user_func($this->$function);

应替换为

call_user_func(array($this, $function));

或者

call_user_func('self::' . $function);

谢谢,马克!

于 2013-09-11T20:40:50.947 回答
1

在使用静态类时,您应该必须使用范围解析运算符 :: 您不能直接创建实例。

$x::myExtClass;

试试看。

于 2013-09-11T20:41:57.633 回答
1

您的错误出现是因为您已声明myFunction()static. 静态方法不属于类的任何特定实例,因此不能通过$this变量访问。相反,您使用self::myFunction()调用静态方法。实现这一点的最简单方法是构建静态方法调用的字符串并将该字符串作为参数传递给call_user_func(). myFunction()如果不是静态的,您的代码将按原样工作。

class myClass {
    function cb_check($function) {
        // Build a static-method-style string
        call_user_func('self::' . $function);
    }

    static function myFunction() {
        var_dump("Hello World");
    }   
}

class myExtClass extends myClass {
    function cb_invoke() {
        $this->cb_check('myFunction');
    }
}

$x = new myExtClass;
$x->cb_invoke();
于 2013-09-11T20:47:21.313 回答