ConFoo 2025

Die Klasse Closure

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Einführung

Klasse zur Darstellung von anonymen Funktionen.

Eine anonyme Funktion erzeugt ein Objekt dieses Typs. Diese Klasse enthält Methoden, mit denen eine anonyme Funktion nach ihrer Erstellung weiterhin kontrolliert werden kann.

Neben den hier aufgeführten Methoden hat diese Klasse auch eine __invoke-Methode. Dies dient der Konsistenz mit anderen Klassen, die die magische Methode __invoke() implementieren, da diese nicht für den Aufruf von Funktionen verwendet wird.

Klassenbeschreibung

final class Closure {
/* Methoden */
private __construct()
public static bind(Closure $closure, ?object $newThis, object|string|null $newScope = "static"): ?Closure
public bindTo(?object $newThis, object|string|null $newScope = "static"): ?Closure
public call(object $newThis, mixed ...$args): mixed
public static fromCallable(callable $callback): Closure
}

Changelog

Version Beschreibung
8.4.0 Die Ausgabe von Closure::__debugInfo() enthält nun den Namen, die Zeile und die Datei der Closure.

Inhaltsverzeichnis

  • Closure::__construct — Konstruktor, der keine Instanziierung zulässt
  • Closure::bind — Dupliziert eine Closure mit einem bestimmten gebundenen Objekt und Geltungsbereich einer Klasse
  • Closure::bindTo — Dupliziert eine Closure mit einem neuen gebundenen Objekt und Geltungsbereich einer Klasse
  • Closure::call — Bindet eine Closure und ruft sie auf
  • Closure::fromCallable — Wandelt ein Callable in eine Closure um
add a note

User Contributed Notes 4 notes

up
466
chuck at bajax dot us
9 years ago
This caused me some confusion a while back when I was still learning what closures were and how to use them, but what is referred to as a closure in PHP isn't the same thing as what they call closures in other languages (E.G. JavaScript).

In JavaScript, a closure can be thought of as a scope, when you define a function, it silently inherits the scope it's defined in, which is called its closure, and it retains that no matter where it's used. It's possible for multiple functions to share the same closure, and they can have access to multiple closures as long as they are within their accessible scope.

In PHP, a closure is a callable class, to which you've bound your parameters manually.

It's a slight distinction but one I feel bears mentioning.
up
105
joe dot scylla at gmail dot com
8 years ago
Small little trick. You can use a closures in itself via reference.

Example to delete a directory with all subdirectories and files:

<?php
$deleteDirectory
= null;
$deleteDirectory = function($path) use (&$deleteDirectory) {
$resource = opendir($path);
while ((
$item = readdir($resource)) !== false) {
if (
$item !== "." && $item !== "..") {
if (
is_dir($path . "/" . $item)) {
$deleteDirectory($path . "/" . $item);
} else {
unlink($path . "/" . $item);
}
}
}
closedir($resource);
rmdir($path);
};
$deleteDirectory("path/to/directoy");
?>
up
71
luk4z_7 at hotmail dot com
9 years ago
Scope
A closure encapsulates its scope, meaning that it has no access to the scope in which it is defined or executed. It is, however, possible to inherit variables from the parent scope (where the closure is defined) into the closure with the use keyword:

function createGreeter($who) {
return function() use ($who) {
echo "Hello $who";
};
}

$greeter = createGreeter("World");
$greeter(); // Hello World

This inherits the variables by-value, that is, a copy is made available inside the closure using its original name.
font: Zend Certification Study Guide.
up
3
info at ensostudio dot ru
2 years ago
compare closures:
<?php
(string) new ReflectionFunction($fn) === (string) new ReflectionFunction($fn2)
?>
To Top