在类扩展中调用的回调

时间:2013-09-11 20:30:39

标签: php

我正在通过php回调工作。我想我已经介绍了基础知识,但是当我在类扩展中工作时,我现在仍然在某个地方碰到砖墙,因此是时候堆栈溢出了rubber duck programming ......!

从类扩展调用回调:

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

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

  

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

     

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

第5行是上面的call_user_func()

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

提前谢谢!

3 个答案:

答案 0 :(得分:4)

正如商标所指出的那样,

call_user_func($this->$function);

应替换为

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

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

谢谢,马克!

答案 1 :(得分:1)

使用静态类时,您必须使用范围解析运算符::您无法直接创建实例。

$x::myExtClass;

试试吧。

答案 2 :(得分: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();