Maison >développement back-end >tutoriel php >Qu'est-ce qu'une fonction anonyme
Fonctions anonymes
Les fonctions anonymes, également appelées fermetures, permettent de créer temporairement une fonction sans nom spécifié. La valeur la plus couramment utilisée comme argument de fonction de rappel. Bien entendu, il existe également d’autres applications.
Les fonctions anonymes sont actuellement implémentées via la classe Closure.
Exemple de fonction anonyme
<?php echo preg_replace_callback('~-([a-z])~', function ($match) { return strtoupper($match[1]); }, 'hello-world'); // 输出 helloWorld ?>
Les fonctions de fermeture peuvent également être utilisées comme valeur de variables. PHP convertira automatiquement cette expression en une instance d'objet de la classe intégrée Closure. La méthode d'affectation d'un objet de fermeture à une variable est la même que la syntaxe d'affectation de variable ordinaire. Un point-virgule doit être ajouté à la fin :
Exemple d'affectation de variable de fonction anonyme
<?php $greet = function($name) { printf("Hello %s\r\n", $name); }; $greet('World'); $greet('PHP'); ?>
Les fermetures peuvent hériter des variables de la portée parent. Toutes ces variables doivent être transmises à l’aide de la construction du langage use. À partir de PHP 7.1, de telles variables ne peuvent pas être transmises : superglobales, $this ou avoir le même nom que les paramètres.
Hériter les variables de la portée parent
<?php $message = 'hello'; // 没有 "use" $example = function () { var_dump($message); }; echo $example(); // 继承 $message $example = function () use ($message) { var_dump($message); }; echo $example(); // Inherited variable's value is from when the function // is defined, not when called $message = 'world'; echo $example(); // Reset message $message = 'hello'; // Inherit by-reference $example = function () use (&$message) { var_dump($message); }; echo $example(); // The changed value in the parent scope // is reflected inside the function call $message = 'world'; echo $example(); // Closures can also accept regular arguments $example = function ($arg) use ($message) { var_dump($arg . ' ' . $message); }; $example("hello"); ?>
Le résultat de la routine ci-dessus est similaire à :
Notice: Undefined variable: message in /example.php on line 6 NULL string(5) "hello" string(5) "hello" string(5) "hello" string(5) "world" string(11) "hello world"
Ces variables doivent être dans la déclaration d’en-tête de fonction ou de classe. L'héritage de variables de la portée parent est différent de l'utilisation de variables globales. Les variables globales existent dans une portée globale, quelle que soit la fonction en cours d'exécution. La portée parent d'une fermeture est la fonction qui définit la fermeture (pas nécessairement la fonction qui l'appelle).
Fermetures et exemples de portée :
<?php // 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。 // 其中有一个方法用来计算购物车中所有商品的总价格,该方法使 // 用了一个 closure 作为回调函数。 class Cart { const PRICE_BUTTER = 1.00; const PRICE_MILK = 3.00; const PRICE_EGGS = 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);; } } $my_cart = new Cart; // 往购物车里添加条目 $my_cart->add('butter', 1); $my_cart->add('milk', 3); $my_cart->add('eggs', 6); // 打出出总价格,其中有 5% 的销售税. print $my_cart->getTotal(0.05) . "\n"; // 最后结果是 54.29 ?>
Cet article est une introduction aux fonctions anonymes. J'espère qu'il sera utile aux amis dans le besoin !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!