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