php - 如何将 `$this` 绑定(bind)到 PHP 函数?

标签 php oop closures

对于 JavaScript,我们可以做这样的事情来将作用域绑定(bind)到所需的函数:

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

// Or…
// $my_function->call($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']); // :(

最佳答案

如果您使用的是 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

关于php - 如何将 `$this` 绑定(bind)到 PHP 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52701638/

相关文章:

scala - 成功和失败函数参数 Scala 模式

javascript - 如何将javascript值存储到mysql数据库中?

python - __metaclass__ 不应该强制在 Python 中使用元类吗?

c# - 为什么在方法结束时返回是一个好习惯

java - 避免空值、不变性、对象状态

rust - 为什么通过 DerefMut 可变借用闭包不起作用?

ios - 了解 UIView.animate 以及完成闭包的工作原理

php - jQuery 下拉菜单不出现

PHP_VERSION_ID 是 int 但未定义。 (PHP-FPM 5.4.4)

PHP 表单,检查 2 个日期是否相隔不远