Fonctions anonymes

Les fonctions anonymes, aussi appel�es fermetures ou closures permettent la cr�ation de fonctions sans pr�ciser leur nom. Elles sont particuli�rement utiles comme fonction de rappel, mais leur utilisation n'est pas limit�e � ce seul usage.

Exemple #1 Exemples avec des fonctions anonymes

<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
    return 
strtoupper($match[1]);
}, 
'bonjour-le-monde');
?>

L'exemple ci-dessus va afficher :

outputs bonjourLeMonde

Les fermetures peuvent aussi �tre utilis�es comme valeurs de variables. PHP va automatiquement convertir ces expressions en objets Closure. Assigner une fermeture � une variable est la m�me chose qu'un assignement classique, y compris pour le point-virgule final.

Exemple #2 Assignation de fonction anonyme � une variable

<?php
$greet 
= function($name)
{
    
printf("Bonjour %s\r\n"$name);
};

$greet('World');
$greet('PHP');
?>

L'exemple ci-dessus va afficher :

outputs bonjourLeMonde

Les fermetures peuvent h�riter des variables du contexte de leur parent. Ces variables doivent alors �tre d�clar� dans la signature de la fonction. L'h�ritage du contexte parent n'est pas la m�me chose que les variables de l'environnement global. Les variables globales existent dans le contexte global, qui est le m�me, quelque que soit la fonction qui s'ex�cute. Le contexte parent d'une fermeture est la fonction dans laquelle la fonction a �t� d�clar� (par n�cessairement la fonction qui appelle). Voyez l'exemple ci-dessous :

Exemple #3 Fonctions anonymes et contexte

<?php
// Un panier d'achat simple, qui contient une liste de produits
// choisis et la quantit� d�sir�e de chaque produite. Il inclut
// une m�thode qui calcule le prix total des �l�ments dans le panier
// en utilisant une fonction de rappel anonyme.
class Panier
{
    const 
PRICE_BEURRE  1.00;
    const 
PRICE_LAIT    3.00;
    const 
PRICE_OEUF    6.95;

    protected   
$products = array();
    
    public function 
add($product$quantity)
    {
        
$this->products[$product] = $quantity;
    }
    
    public function 
getQuantity($product)
    {
        return isset(
$this->products[$product]) ? $this->products[$product] :
               
FALSE;
    }
    
    public function 
getTotal($tax)
    {
        
$total 0.00;
        
        
$callback =
            function (
$quantity$product) use ($tax, &$total)
            {
                
$pricePerItem constant(__CLASS__ "::PRICE_" .
                    
strtoupper($product));
                
$total += ($pricePerItem $quantity) * ($tax 1.0);
            };
        
        
array_walk($this->products$callback);
        return 
round($total2);;
    }
}

$mon_panier = new Panier;

// Ajout d'�l�ment au panier
$mon_panier->add('beurre'1);
$mon_panier->add('lait'3);
$mon_panier->add('oeuf'6);

// Affichage du prix avec 5.5% de TVA
print $mon_panier->getTotal(0.055) . "\n";
?>

L'exemple ci-dessus va afficher :

54.54

Les fonctions anonymes sont actuellement impl�ment�e en utilisant la classe Closure. C'est un d�tail d'impl�mentation, et il est recommand� de ne pas s'appuyer dessus.

Note: Les fonctions anonymes sont disponibles depuis PHP 5.3.0.

Note: Il est possible d'utiliser les fonctions func_num_args(), func_get_arg() et func_get_args() dans une fermeture.