Closure::bindTo
(PHP 5 >= 5.4.0, PHP 7, PHP 8)
Closure::bindTo —
Duplica la closure con una nuova associazione all'oggetto e alla visibilità della classe
Descrizione
“L'oggetto associato” determina il valore che avrà $this
nel corpo della funzione e la “visibilità della classe” rappresenta una classe
che determina a quali membri private e protected la funzione
sarà in grado di accedere. Ossia, i membri che saranno
visibili sono gli stessi che sarebbero se la funzione anonima fosse un metodo della
classe data come valore dal parametro
newScope
.
Le closure statiche non possono avere nessun oggetto associato (il valore del parametro
newThis
deve essere null
), ma questa funzione può
comunque essere utilizzata per cambiare la loro visibilità.
Questa funzione si assicurerà che per una closure non-statica, avere un'istanza
associata implicherà essere convertita e viceversa. A tal fine,
le closure non-statiche a cui sono date una visibilità diversa da un'istanza null
sono rese
statiche e le closure non-statiche senza visibilità a cui sono date un'istanza
non null sono convertite in una classe non specificata.
Nota:
Se hai soltanto intenzione di duplicare la funzione anonima, invece puoi usare la
clonazione.
Elenco dei parametri
newThis
-
L'oggetto al quale la funzione anonima data dovrebbe essere associata, o
null
per le closure da dissociare.
newScope
-
L'ambito della classe a cui deve essere associata la closure, o
'static' per mantenere il corrente. Se invece viene dato un oggetto, verrà usato
il tipo dell'oggetto. Questo determina la visibilità dei metodi
protected e private dell'oggetto associato.
Non è consentito passare (un oggetto di) una classe interna come valore di questo parametro.
Valori restituiti
Restituisce un nuovo oggetto Closure creato
o null
in caso di fallimento.
Esempi
Example #1 Esempio di Closure::bindTo()
<?php
class A {
private $val;
function __construct($val) {
$this->val = $val;
}
function getClosure() {
//restituisce la closure associata con il suo oggetto e con la sua visibilità
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";
?>
Il precedente esempio visualizzerà
qualcosa simile a: