Closure::bindTo
(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";
?>
Вывод приведённого примера будет похож на: