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($total, 2);;
}
}
$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.