Класс, используемый для представления анонимных функций .

Анонимные функции выдают объекты этого типа. Этот класс имеет методы, которые позволяют в дальнейшем управлять анонимной функцией после ее создания.

Помимо перечисленных здесь методов, у этого класса также есть __invokeметод. Это делается для согласованности с другими классами, реализующими магию вызова , поскольку этот метод не используется для вызова функции.

final class Closure {
/* Methods */
private __construct()
public static bind(Closure $closure, ?object $newThis, object|string|null $newScope = "static"): ?Closure
public bindTo(?object $newThis, object|string|null $newScope = "static"): ?Closure
public call(object $newThis, mixed ...$args): mixed
public static fromCallable(callable $callback): Closure
}

Closure::__construct

Closure::__construct — Конструктор, запрещающий создание экземпляров

private Closure::__construct()

Этот метод существует только для того, чтобы запретить создание экземпляра класса Closure . Объекты этого класса создаются способом, описанным на странице анонимных функций .

Closure::bind

Closure::bind — Дублирует замыкание с определенным связанным объектом и областью действия класса

public static Closure::bind(Closure $closure, ?object $newThis, object|string|null $newScope = "static"): ?Closure

Параметры:

Этот метод является статической версией Closure::bindTo() . См. документацию этого метода для получения дополнительной информации.

  • closure - Анонимные функции для привязки.
  • newThis - Объект, к которому должна быть привязана данная анонимная функция, или nullчтобы замыкание не было привязано.
  • newScope - Область класса, с которой должно быть связано закрытие, или «статическая», чтобы сохранить текущую. Если задан объект, вместо него будет использоваться тип объекта. Это определяет видимость защищенных и закрытых методов привязанного объекта. Не разрешается передавать (объект) внутреннего класса в качестве этого параметра.

Пример #1 Пример использования Closure::bind()

<?php
class A {
    private static $sfoo = 1;
    private $ifoo = 2;
}
$cl1 = static function() {
    return A::$sfoo;
};
$cl2 = function() {
    return $this->ifoo;
};

$bcl1 = Closure::bind($cl1, null, 'A');
$bcl2 = Closure::bind($cl2, new A(), 'A');
echo $bcl1(), "\n";
echo $bcl2(), "\n";
?>

Closure::bindTo

losure::bindTo — Дублирует замыкание с новым связанным объектом и областью действия класса

public Closure::bindTo(?object $newThis, object|string|null $newScope = "static"): ?Closure

Создайте и верните новую анонимную функцию с тем же телом и связанными переменными, что и у этой, но, возможно, с другим связанным объектом и новой областью действия класса.

«Связанный объект» определяет значение $this, которое будет иметь тело функции, а «область действия класса» представляет собой класс, который определяет, к каким закрытым и защищенным членам анонимная функция сможет получить доступ. А именно, члены, которые будут видны, будут такими же, как если бы анонимная функция была методом класса, заданного в качестве значения newScope параметра.

Статические замыкания не могут иметь связанного объекта (значение параметра newThisдолжно быть null), но эту функцию, тем не менее, можно использовать для изменения их области видимости класса.

Эта функция гарантирует, что для нестатического замыкания наличие связанного экземпляра будет означать область видимости и наоборот. С этой целью нестатические замыкания, которым задана область действия, но nullэкземпляр, делаются статическими, а нестатические замыкания без области действия, которым задан ненулевой экземпляр, ограничиваются неуказанным классом.

Параметры:

  • newThis - Объект, к которому должна быть привязана данная анонимная функция, или nullчтобы замыкание не было привязано.
  • newScope - Область класса, с которой должно быть связано закрытие, или «статическая», чтобы сохранить текущую. Если задан объект, вместо него будет использоваться тип объекта. Это определяет видимость защищенных и закрытых методов привязанного объекта. Не разрешается передавать (объект) внутреннего класса в качестве этого параметра.

Пример #1 Пример использования Closure::bindTo()

<?php

class A {
    function __construct($val) {
        $this->val = $val;
    }
    function getClosure() {
        //returns closure bound to this object and scope
        return function() { return $this->val; };
    }
}

$ob1 = new A(1);
$ob2 = new A(2);

$cl = $ob1->getClosure();
echo $cl(), "\n";
$cl = $cl->bindTo($ob2);
echo $cl(), "\n";
?>

Closure::call

Closure::call — Связывает и вызывает замыкание

public Closure::call(object $newThis, mixed ...$args): mixed

Параметры:

  • newThis - Объект , к которому привязывается замыкание на время вызова.
  • args - Ноль или более параметров, которые будут переданы в качестве параметров замыкания.

Пример #1 Пример использования Closure::call()

<?php
class Value {
    protected $value;

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

    public function getValue() {
        return $this->value;
    }
}

$three = new Value(3);
$four = new Value(4);

$closure = function ($delta) { var_dump($this->getValue() + $delta); };
$closure->call($three, 4);
$closure->call($four, 4);
?>

Closure::fromCallable

Closure::fromCallable — Преобразует вызываемый объект в замыкание

public static Closure::fromCallable(callable $callback): Closure

Создайте и верните новую анонимную функцию из заданного, callbackиспользуя текущую область. Этот метод проверяет, можно ли callbackвызывать в текущей области, и выдает TypeError , если это не так.