我如何使用在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假设回调函数是一个方法,因为它是括号的,并且它不会尝试循环一个属性
为了达到预期的结果,您需要将属性回调的/ reference引用存储在本地变量中,并使用以下语法:

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

由于美元符号括号,它将其标识为封闭; 或者用call_user_func函数调用它:

call_user_func($this->callback);

另一方面,这是一个预计回调的内置函数。

链接地址: http://www.djcxy.com/p/57939.html

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

下一篇: PHP Variables, classes and inheritance understanding the basics