(PHP 5 >= 5.4.0, PHP 7, PHP 8)
Closure::bindTo — Дублирует замыкание с новым связанным объектом и областью видимости класса
Метод создаёт и возвращает новую анонимную функцию с телом и связанными переменными как у анонимной функции, которую связывает метод, но с другим связанным объектом и новой областью видимости класса.
«Связанный объект» определяет значение $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