Closure::bindTo
(PHP 5 >= 5.4.0, PHP 7, PHP 8)
Closure::bindTo —
Duplica a closure com um novo objeto vinculado e escopo de classe.
Descrição
O “obeto ligado” determina o valor que $this
terá
no corpo da função e o “escopo de classe” representa uma classe
que determina quais membros privados e protegidos a função
anônima será capaz de acessar. Nomeadamente, os membros que estarão
visíveis serão os mesmos que estariam, se a função anônima fosse um método da
classe informada como valor do parâmetro
newScope
.
Closures estáticas não podem ter nenhum objeto ligado (o valor do parâmetro
newThis
deveria ser null
), mas esta função pode
entretanto ser utilizada para alterar seus escopos de classe.
Esta função vai assegurar que, para uma closure não estática, possuir uma
instância ligada irá implicar em ter escopo definido e vice-versa. Para este fim,
closures não estáticas que recebem um escopo com instância null
são tornadas
estáticas; e closures não estáticas sem escopo que recebem uma instância
não nula têm o escopo definido para uma classe não especificada.
Nota:
Se for requerido duplicar as funções anônimas, pode ser utilizada
clonagem alternativamente.
Parâmetros
-
newThis
-
O objeto ao qual a função anônima informada deve ser ligada, ou
null
para que a closure seja não ligada.
-
newScope
-
O escopo de classe ao qual a closure deve ser associada, ou
'static' para manter a atual. Se um objeto for informado, o tipo do
objeto será usado no lugar. Isto determina a visibilidade de métodos
protegidos e privados do objeto ligado.
Não é permitido passar (um objeto de) uma classe interna neste parâmetro.
Valor Retornado
Retorna o novo objeto Closure criado
ou null
em caso de falha.
Exemplos
Exemplo #1 Exemplo de Closure::bindTo()
<?php
class A {
private $val;
function __construct($val) {
$this->val = $val;
}
function getClosure() {
//retorna a closure ligada a este objeto e escopo
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";
?>
O exemplo acima produzirá
algo semelhante a: