如何使用在PHP中存储为类成员的回调函数?

时间:2012-08-26 15:27:18

标签: 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。

3 个答案:

答案 0 :(得分:3)

您可以将makeCall方法更改为:

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

答案 1 :(得分:2)

将其作为字符串传递,并通过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();

答案 2 :(得分:2)

关于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-&gt; callback()时,PHP假定回调是一个方法,因为括号和它不会尝试循环一个属性< / strong>即可。
要获得预期的结果,您需要在属性回调中存储/引用的副本,并使用以下语法:

$callback = $this->callback;
return $callback();
由于美元符号括号,

将其标识为闭包;或使用call_user_func函数调用它:

call_user_func($this->callback);
另一方面,

期望回调的内置函数。