我正在通过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()
。
有人知道我在这里缺少什么吗?
提前谢谢!
答案 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();