如何使用回调函数,该函数作为类成员存储在PHP中


How can I use a callback function which is stored as a class member in PHP?

考虑以下代码,这是一种将回调函数存储为成员,然后使用它的方案:

class MyClass {
  function __construct($callback) {
    $this->callback = $callback;
  }
  function makeCall() {
    return $this->callback();
  }
}
function myFunc() {
  return 'myFunc was here';
}
$o = new MyClass(myFunc);
echo $o->makeCall();

我希望myFunc was here得到响应,但我得到的却是:

Call to undefined method MyClass::callback()

有人能解释一下这里出了什么问题吗?为了得到想要的行为,我能做些什么吗?

如果重要的话,我使用的是PHP 5.3.13。

您可以将makeCall方法更改为:

function makeCall() {
  $func = $this->callback; 
  return $func();
}

将其作为字符串传递并通过call_user_func调用。

class MyClass {
  function __construct($callback) {
    $this->callback = $callback;
  }
  function makeCall() {
    return call_user_func($this->callback);
  }
}
function myFunc() {
  return 'myFunc was here';
}
$o = new MyClass("myFunc");
echo $o->makeCall();

PHP的一个重要之处在于,它用语法而不是内容来识别符号的类型,因此您需要明确说明所指的内容。
在许多语言中,你只需写:

myVariable
myFunction
myConstant
myClass
myClass.myStaticMethod
myObject.myMethod

解析器/编译器知道每个符号的含义,因为它只需知道分配给它们的内容就可以知道它们指的是什么
然而,在PHP中,您需要使用语法让解析器知道您指的是什么"符号命名空间",所以通常您会写:

$myVariable
myFunction()
myConstant
new myClass
myClass::myStaticMethod()
$myObject->method()

但是,正如您所看到的,这些是调用而不是引用。要在PHP中传递对函数、类或方法的引用,需要使用字符串和数组的组合语法:

'myFunction'
array('myClass', 'myStaticMethod')
array($myObject, 'myMethod')

在您的情况下,您需要使用'myFunc'来代替myFunc,让PHP知道您正在传递对函数的引用,而不是检索myFunc常量的值。

另一个分支是,当您编写$myObject->callback()时,PHP假设callback是一个方法,因为有括号,并且不会试图循环一个属性
为了实现预期的结果,您需要在本地变量中存储属性回调的副本/引用,并使用以下语法:

$callback = $this->callback;
return $callback();

它将其标识为闭包,因为圆括号中有美元符号;或者用call_user_func函数调用它:

call_user_func($this->callback);

另一方面,它是期望回调的内置函数。