(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.
$newThis, object|string|null $newScope = "static"): ?ClosureCrea 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.
newThis
El objeto al que vincular la función anónima, o null para que el cierre
quede desvinculado.
newScopeEl á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.
| Versión | Descripción |
|---|---|
| 8.5.0 |
Vincular una instancia a un cierre estático, o vincular un método de una
jerarquía de clases incompatible, ahora está obsoleto (estos casos ya
emitían un E_WARNING).
|
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:
1 2