在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.我认为反思在这里可能有用,但我不确定如何.
正如您在注释中所读到的,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/
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |