如何在类作用域外部的可调用对象中访问$this?
解决PHP匿名函数内调用类方法的$this上下文问题
你遇到的错误是因为PHP普通匿名函数不会自动继承外部的$this上下文,要实现类似JS中匿名函数调用类方法的效果,有三种常用方案:
方案1:通过use捕获对象实例
直接把当前foo实例传递给匿名函数,在函数内用实例调用方法:
class foo { function bar(callable $callable) { $callable(); } function printStr() { echo "hi"; } } $foo = new foo(); $foo->bar(function () use ($foo) { $foo->printStr(); // 直接通过实例调用方法 });
方案2:使用PHP 7.4+箭头函数(推荐)
箭头函数会自动继承外部作用域的$this,写法更简洁:
class foo { function bar(callable $callable) { $callable(); } function printStr() { echo "hi"; } } $foo = new foo(); $foo->bar(fn() => $this->printStr()); // 箭头函数自动继承$this
方案3:在bar方法内绑定$this到回调函数
如果不想修改调用处的代码,可以在bar方法内部将回调函数绑定到当前对象:
class foo { function bar(callable $callable) { // 将回调绑定到当前对象,确保$this有效 $boundCallable = $callable->bindTo($this, $this); $boundCallable(); } function printStr() { echo "hi"; } } $foo = new foo(); $foo->bar(function () { $this->printStr(); // 此时$this已绑定到foo实例 });
原理说明
PHP的普通匿名函数是独立作用域,默认不会携带外部的$this;箭头函数作为语法糖,会自动继承外部作用域的$this;bindTo方法则是手动将回调函数的上下文绑定到指定对象,让函数内的$this指向该对象。
内容的提问来源于stack exchange,提问作者Basil
相关产品推荐
相关产品推荐

