在PHP中等效的Function.prototype.apply?

And*_*ers 5 php function this

在Javascript中,您可以使用控制this关键字引用的对象apply.在以下示例中,foo将使用this等于bar:

function foo() { console.log(this); }

let bar = {};
foo.apply(bar);
Run Code Online (Sandbox Code Playgroud)

有没有办法在PHP中实现相同的效果?只是创建一个$this在类之外引用的函数似乎是可能的,但它(不出所料)只是被视为任何未定义的变量.

我知道call_user_func_array,但它不允许我分配$this.我认为反思在这里可能有用,但我不确定如何.

Gab*_*ing 2

正如您在注释中所读到的,PHP$this中指的是对象上下文,这可能与 JavaScript 上下文不同。

然而,谈到作用域,您可以使用承载对象作用域的闭包。该范围位于 $this 变量内,可以使用Closure::bindTo或进行更改Closure::bind

他们俩都有改变封闭范围的意图。它的意思是改变变量内部的对象$this

这是一个简单的例子:

class Foo
{
    private $number;

    public function __construct($number)
    {
        $this->number = $number;
    }

    public function getClosure()
    {
        return function() {
            echo $this->number;
        };
    }        
}
Run Code Online (Sandbox Code Playgroud)

及其用途:

$foo = new Foo(10);
$closure = $foo->getClosure();
$closure();
Run Code Online (Sandbox Code Playgroud)

输出:

10

数字 10 是实例中类$number内私有变量的值。Foo$foo

更改范围,当我们从其他实例访问相同变量时,我们可以获得不同的结果:

$foo = new Foo(10);
$foo2 = new Foo(50);
$closureFoo = $foo->getClosure();
$closureFoo();//First execution

echo ' and ';

$closureFoo2 = $closureFoo->bindTo($foo2);
$closureFoo2();//Second execution
Run Code Online (Sandbox Code Playgroud)

输出:

10 和 50

如果你想使用Closure::bind,那就是代码:

$closureFoo2 = Closure::bind($closureFoo , $foo2);
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到更多示例:/sf/answers/2854081191/