📅  最后修改于: 2023-12-03 14:45:10.246000             🧑  作者: Mango
在 PHP 7 中,Closure 类提供了一个便捷的方法去执行闭包函数,这个方法就是 call()
。
call()
方法的定义如下:
public mixed Closure::call ( object $newthis [, mixed $...$parameters ] )
Closure::call()
接收两个参数:
$newthis
:指定闭包函数中 $this
关键字的值。$parameters
(可选):指定调用闭包函数时所传入的参数。Closure::call()
返回闭包函数的执行结果。
下面是一个示例,演示了如何使用 Closure::call()
去修改闭包函数中的 $this
关键字的值,并传递参数:
class Foo
{
public $x = 3;
}
$myClosure = function($y) {
// 访问 $this 关键字
return $this->x + $y;
};
$obj = new Foo();
// 调用闭包函数并传递参数
$result = $myClosure->call($obj, 5);
echo $result; // 输出 "8"
在上面的示例中,我们首先定义了一个 Foo
类,它有一个公共属性 $x
。然后,我们创建了一个匿名函数 myClosure
,它访问了 $this->x
并返回一个加法结果。
最后,我们创建了一个 Foo
对象,并调用了 myClosure
函数,指定了它的 $this
关键字的值为这个对象,并传递了一个 5
的参数。函数执行的结果为 8
,因为 $this->x
的值为 3
,加上 5
的结果为 8
。
我们可以看到,在上面的代码中,使用 Closure::call()
可以很方便地修改闭包函数的 $this
关键字的值并传递参数,而不用考虑上下文或其他方面的问题。
在调用 Closure::call()
时,如果不指定 $newthis
参数,则函数的 $this
关键字将保持不变,如下所示:
class Bar
{
public function test()
{
$myClosure = function() {
// 访问 $this 关键字
return $this->x;
};
// 调用闭包函数
return $myClosure->call();
}
}
$obj = new Bar();
$obj->x = 4;
$result = $obj->test();
echo $result; // 输出 "4"
在上面的示例中,我们定义了一个 Bar
类,它有一个 test()
方法,该方法返回一个闭包函数 myClosure
的执行结果。在 myClosure
中,我们访问了 $this->x
,这个值并没有在 test()
方法中定义。
然后,我们创建了一个 Bar
对象,并将它的 $x
属性设为了 4
。最后,我们调用了 test()
方法,闭包函数 myClosure
的 $this
关键字的值为 null
,因此它返回的结果为 $this->x
的默认值 null
。