📜  PHP 7-Closure :: call()(1)

📅  最后修改于: 2023-12-03 14:45:10.246000             🧑  作者: Mango

PHP 7-Closure :: call()

在 PHP 7 中,Closure 类提供了一个便捷的方法去执行闭包函数,这个方法就是 call()

定义

call() 方法的定义如下:

public mixed Closure::call ( object $newthis [, mixed $...$parameters ] )
参数

Closure::call() 接收两个参数:

  1. $newthis:指定闭包函数中 $this 关键字的值。
  2. $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