Closure::bindTo

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

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

Описание

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

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

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

Этим методом нельзя связывать статические замыкания с объектами, а изменить область видимости класса статического замыкания методом всё-таки получится, при этом в параметр newThis требуется передать значение null.

Метод гарантирует, что у нестатического замыкания, которое связали с объектом, будет доступ к контексту этого объекта, и наоборот — у нестатического замыкания, которое связали без передачи объекта, доступа к контексту объекта не будет. Для этого а) нестатические замыкания, которым при вызове метода установили область видимости, но вместо объекта передали null, станут статическими; б) нестатические замыкания, которым при вызове метода не указали область видимости, но передали объект, получат область видимости неопределённого класса.

Замечание:

Вместо этого метода пользуются клонированием, когда требуется только дублировать анонимную функцию.

Список параметров

newThis

Объект, с которым метод свяжет анонимную функцию, или null, чтобы метод не связывал замыкание.

newScope

При передаче строкового аргумента: название класса, с областью видимости которого метод свяжет замыкание, или ключевое слово 'static', чтобы замыкание сохранило текущую область видимости. При передаче объекта как аргумента: роль названия класса будет играть тип объекта. Параметр определяет видимость защищённых и закрытых методов связанного объекта. Нельзя передавать в параметр название или экземпляр объекта внутреннего PHP-класса.

Возвращаемые значения

Метод возвращает новый объект замыкания Closure или null, если возникла ошибка.

Примеры

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

<?php

class A
{
private
$val;

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

public function
getClosure()
{
// Метод возвращает замыкание, которое он связал с текущими объектом и областью видимости
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";

?>

Вывод приведённого примера будет похож на:

1
2

Смотрите также