CakeFest 2017 NYC, the Official CakePHP Conference

La classe Closure

(PHP 5 >= 5.3.0, PHP 7)


Classe utilisée pour représenter les fonctions anonymes.

Les fonctions anonymes, implémentées depuis PHP 5.3, sont portées par des objets de ce type. Au départ il s'agissait d'un détail d'implémentation, mais maintenant cette classe prend du sens. Depuis PHP 5.4, cette classe possède des méthodes qui permettent de prendre le contrôle sur la fonction après sa création.

En plus des méthodes précisées ici, cette classe possède aussi une méthode __invoke. Ceci pour des raisons de logique avec l'implémentation de la méthode magique d'appel.

Synopsis de la classe

Closure {
/* Méthodes */
__construct ( void )
public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope = "static" ] )
public Closure bindTo ( object $newthis [, mixed $newscope = "static" ] )
public mixed call ( object $newthis [, mixed $... ] )


  • Closure::__construct — Constructeur empêchant l'instanciation
  • Closure::bind — Duplique une fermeture avec un nouvel objet lié et un nouveau contexte de classe.
  • Closure::bindTo — Duplique la fermeture avec un nouvel objet lié et un nouveau contexte de classe.
  • Closure::call — Binds and calls the closure
add a note add a note

User Contributed Notes 3 notes

chuck at bajax dot us
1 year 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.
joe dot scylla at gmail dot com
10 months ago
Small little trick. You can use a closures in itself via reference.

Example to delete a directory with all subdirectories and files:

= 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);
luk4z_7 at hotmail dot com
1 year ago
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.
To Top