You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在类作用域外部的可调用对象中访问$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 10:39:56