如何将$ this绑定到PHP函数?

时间:2018-10-08 11:50:58

标签: php oop closures

使用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']); // :(

3 个答案:

答案 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)();

请参见https://3v4l.org/aEnSI

答案 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