使用JavaScript,我们可以执行以下操作将作用域绑定到所需的功能:
function myFunction() {
alert(this.foo);
}
var MyClass = function() {
this.foo = 1;
};
var c = new MyClass();
myFunction.call(c); // `1`
我想用PHP做同样的事情。目前,我认为成功的工作是这样的,但这仅适用于匿名函数:
$my_function = function() {
var_dump($this->foo);
};
class MyClass {
public $foo = 1;
};
$c = new MyClass();
Closure::bind($my_function, $c)();
这不起作用:
function my_function() {
var_dump($this->foo);
}
class MyClass {
public $foo = 1;
};
$c = new MyClass();
Closure::bind('my_function', $c)(); // :(
call_user_func([$c, 'my_function']); // :(
答案 0 :(得分:2)
如果您使用的是PHP 7.1+,则可以使用Closure::fromCallable
将任何可调用的PHP转换为Closure
(有关差异的某些信息,请参见PHP: Type hinting - Difference between `Closure` and `Callable`):
$closure = Closure::fromCallable('my_function');
这时,您可以bind
将您的对象实例执行并执行:
Closure::bind($closure, $c)();
答案 1 :(得分:0)
如果您遵循docs,它将变为:
<?php
$my_function = function() {
var_dump($this->foo);
};
class MyClass {
public $foo = 1;
}
$c = new MyClass();
$f = Closure::bind($my_function, $c);
$f();
答案 2 :(得分:0)
你很近。
使用您的代码:
$my_function = function() {
var_dump($this->foo);
};
class MyClass {
public $foo = 1;
}
$c = new MyClass();
$bound = Closure::bind($my_function, $c);
$bound();
但是不需要使用bind()
静态方法。 $my_function
已经是callable
,因此您可以直接执行以下操作:
$bound = $my_function->bindTo($c);
$bound()
您可以看到两个版本都适用于here。