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