Closure::bindTo
(PHP 5 >= 5.4.0, PHP 7, PHP 8)
Closure::bindTo —
Dupliziert eine Closure mit einem neuen gebundenen Objekt und Geltungsbereich einer Klasse
Beschreibung
Das "gebundene Objekt" bestimmt den Wert, den $this
im
Funktionskörper haben wird, und der "Klassenbereich" ist eine Klasse, die
bestimmt, auf welche private und protected Mitglieder die anonyme Funktion
zugreifen kann. Das heißt, die für die Funktion sichtbaren Mitglieder sind
dieselben, als ob die anonyme Funktion eine Methode der im Parameter
newScope
übergebenen Klasse wäre.
Eine statische Closure kann zwar kein Objekt binden (der Wert des
Parameters newThis
muss null
sein), aber diese
Funktion kann trotzdem verwendet werden, um den Geltungsbereich ihrer
Klasse zu ändern.
Diese Funktion stellt sicher, dass eine nicht-statische Closure mit einer
gebundenen Instanz einen Geltungsbereich hat und umgekehrt. Zu diesem Zweck
wird eine nicht-statische Closure, der zwar ein Geltungsbereich, dafür aber
nur eine eine null
-Instanz gegeben wird, statisch gemacht, und eine
nicht-statische Closure ohne Geltungsbereich, die eine Nicht-null
-Instanz
erhält, kommt in den Geltungsbereich einer nicht spezifizierte Klasse.
Hinweis:
Wenn nur anonyme Funktionen dupliziert werden sollen, kann
stattdessen cloning verwendet
werden.
Parameter-Liste
-
newThis
-
Das Objekt, an das die angegebene anonyme Funktion gebunden werden soll,
oder null
wenn die Closure nicht gebunden werden soll.
-
newScope
-
Der Bereich der Klasse, dem die Closure zugeordnet werden soll, oder
'static', um den aktuellen Bereich beizubehalten. Wenn ein Objekt
angegeben wird, wird stattdessen der Typ des Objekts verwendet. Dieser
bestimmt die Sichtbarkeit der protected und private Methoden des
gebundenen Objekts. Es ist nicht erlaubt, eine interne Klasse (oder ein
Objekt einer solchen) als Parameter zu übergeben.
Rückgabewerte
Gibt ein neu erstelltes Closure-Objekt zurück oder
null
, wenn ein Fehler auftritt.
Beispiele
Beispiel #1 Closure::bindTo()-Beispiel
<?php
class A {
private $val;
function __construct($val) {
$this->val = $val;
}
function getClosure() {
// gibt eine Closure zurück, die an dieses Objekt und diesen Bereich gebunden ist
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";
?>
Das oben gezeigte Beispiel erzeugt
eine ähnliche Ausgabe wie: