Closure::bindTo
(PHP 5 >= 5.4.0, PHP 7, PHP 8)
Closure::bindTo —
Duplica el cierre con un nuevo objeto vinculado y un nuevo ámbito de clase.
Descripción
Crea y devuelve una nueva función anónima
con el mismo cuerpo y las mismas variables vinculadas que la original, pero con un objeto vinculado
que puede ser diferente, y un nuevo ámbito de clase.
El objeto vinculado determina el valor que $this tendrá en el cuerpo de la función,
y el ámbito de clase representa una clase que determina a qué miembros privados y protegidos
la función anónima tendrá acceso. En otras palabras, los miembros que serán visibles serán los
mismos que si la función anónima fuera un método de la clase pasada a través del parámetro
newScope.
Los cierres estáticos no pueden tener ningún objeto vinculado (el valor del parámetro
newThis debería ser null), pero este método puede
utilizarse igualmente para cambiar su ámbito de clase.
Este método garantiza que, para un cierre no estático, tener una instancia
vinculada implica tener un ámbito, y viceversa. Con este fin, los cierres no
estáticos a los que se les da un ámbito pero una instancia null se convierten
en estáticos, y los cierres no estáticos sin ámbito a los que se les da una
instancia no nula reciben como ámbito una clase no especificada.
Nota:
Si solo se desea duplicar la función anónima, puede utilizarse
el clonado en su lugar.
Parámetros
newThis
-
El objeto al que vincular la función anónima, o null para que el cierre
quede desvinculado.
newScope
-
El ámbito de clase a asociar con el cierre, o 'static' para conservar el
ámbito actual. Si se pasa un objeto, su tipo será utilizado.
Esto determina la visibilidad de los métodos protegidos y privados del objeto vinculado.
No está permitido pasar (un objeto de) una clase interna para
este parámetro.
Valores devueltos
Devuelve el objeto Closure recién creado,
o null en caso de error.
Ejemplos
Ejemplo #1 Ejemplo Closure::bindTo()
<?php
class A
{
private $val;
public function __construct($val)
{
$this->val = $val;
}
public function getClosure()
{
//Retorna un cierre vinculado a este objeto y ámbito
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";
?>
Resultado del ejemplo anterior
es similar a: