在类扩展中调用的回调


callback invoked in class extension

我正在通过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();

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

注意:未定义的属性:myExtClass::$myFunction in F:''test.php on 第 5 行

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

第 5 行是上面的call_user_func()

有人知道我在这里错过了什么吗?

提前谢谢你!

正如马克指出的,

call_user_func($this->$function);

应替换为

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

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

谢谢,马克!

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

$x::myExtClass;

试试吧。

您的错误是因为您已声明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();