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