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 fonctions 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');
?>

Les fonctions anonymes 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');
?>

Les fonctions anonymes peuvent hériter des variables du contexte de leur parent. Ces variables doivent alors être déclarées 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, quelle que que soit la fonction qui s'exécute. Le contexte parent d'une fonction anonyme est la fonction dans laquelle la fonction a été déclarée (pas nécessairement celle 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 produit. 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";
?>

Les fonctions anonymes sont implémentées en utilisant la classe Closure.

Historique

Version Description
5.4.0 $this peut désormais être utilisé dans les fonctions anonymes.
5.3.0 Les fonctions anonymes deviennent disponibles.

Notes

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

LoadingChargement en cours