【发布时间】:2015-08-19 10:47:39
【问题描述】:
在 PHP 中,为了定义回调,可以使用闭包,传递静态参数的工具是 use 指令。
class MyClass {
public function foo($x) {
echo $x;
}
public function bar() {
$x = '123';
$callback = function () use ($x) {
$this->foo($x);
};
$callback();
}
}
$myClass = new MyClass();
$myClass->bar();
是否有可能/如何避免匿名函数并用方法替换它?
class MyClass {
public function foo($x) {
echo $x;
}
public function baz() {
$x = '567';
// There is no function with the name create_user_func.
// Just to show, what I'm looking for.
$callback = create_callback([$this, 'foo'], $params = [$x]);
$callback();
}
}
$myClass = new MyClass();
$myClass->baz();
编辑:
一些额外的/背景信息(明确说明我想要实现的目标和原因——并避免误解):
在我的具体情况下,我需要将回调传递给框架的方法。这意味着:我不能/可能不会影响它的调用方式。
该方法只接受回调本身,不接受回调的参数。这意味着,回调必须“知道”/提供它需要的静态参数(及其值)。
这正是use 指令解决的问题。但是我的方法中有多个回调定义,而且方法越来越长。所以我想将回调的逻辑移动到单独的方法中。
【问题讨论】:
-
查看这个方法:php.net/manual/en/reflectionfunction.invoke.php。也许这就是你要找的东西?
-
它对我不起作用。 “args - 传入的参数列表。它接受传递给函数的可变数量的参数,就像 call_user_func() 一样。”但实际上除了
call_user_func()之外,ReflectionFunction#_construct(...)不接受像[$this, 'foo']这样的数组。仍然可以传递参数,但只能传递非静态参数,不能传递静态/早期绑定参数。 -
基本上你是在尝试模拟 Javascript 的
someFunc.bind(null, x)?
标签: php lambda closures anonymous-function