Maison > développement back-end > tutoriel php > Explication détaillée des fonctions anonymes et des fonctions de fermeture en PHP

Explication détaillée des fonctions anonymes et des fonctions de fermeture en PHP

零到壹度
Libérer: 2023-03-23 16:00:02
original
3108 Les gens l'ont consulté

Le contenu de cet article est de partager avec vous une explication détaillée des fonctions anonymes et des fonctions de fermeture en php. Il a une certaine valeur de référence. Les amis dans le besoin peuvent se référer à

Anonymat. en php Fonction et fonction de fermeture


balises : Fonction anonyme fonction de fermeture fonction de fermeture php fonction anonyme php utilisation de la fonction


Introduction : Anonyme Les fonctions et les fonctions de fermeture ne sont pas des connaissances particulièrement avancées, mais de nombreux amis qui débutent sont toujours confus, car tout le monde est habitué à écrire des fonctions juste pour les appeler. À quoi servent les fonctions anonymes et les fonctions de fermeture ?

Fonctions anonymes

L'explication officielle de PHP est la suivante :
Les fonctions anonymes (Fonctions anonymes), également appelées fermetures, permettent la création temporaire d'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.

Ce qui est dit ici est très simple, il peut être utilisé comme fonction de rappel. L'exemple suivant est comme une fonction de rappel

<?php
echo preg_replace_callback(&#39;~-([a-z])~&#39;, function ($match) {
    return strtoupper($match[1]);
}, &#39;hello-world&#39;);
// 输出 helloWorld
?>
Copier après la connexion

Dans l'exemple ci-dessus. , preg_replace_callback La fonction nécessite trois paramètres. Le premier paramètre est une expression régulière utilisée pour faire correspondre les données, le deuxième paramètre est une fonction et le troisième paramètre est la chaîne qui doit être mise en correspondance. comme ce qui suit

<?php
$testFunc = function ($match) {
        return strtoupper($match[1]);
    };
 
 echo preg_replace_callback(&#39;~-([a-z])~&#39;, $testFunc, &#39;hello-world&#39;);
 // 输出 helloWorld
 ?>
Copier après la connexion

Mais nous voyons que nous n'avons besoin d'utiliser cette méthode qu'une seule fois, il n'est donc pas nécessaire de la nommer à nouveau, et il n'est pas nécessaire de l'affecter à une variable (le processus d'attribuer une valeur à une variable : PHP convertira automatiquement cette expression en une instance d'objet de la classe intégrée Closure et l'attribuera à une variable)

Fonction de fermeture

Fonctions anonymes en PHP sont également appelées fonctions de fermeture, il n'y a donc aucune différence. Mais le concept de fermeture au sens général n'est pas comme ça. Parlons d'abord de fermeture au sens traditionnel, et proposons un article pour comparer les fermetures en js avec les fermetures (fonctions anonymes) en php.
Apprendre la fermeture Javascript (Closure) - Ruan Yifeng

Il n'y a en fait pas de fonction de fermeture au sens traditionnel en PHP, car les fonctions en PHP ne peuvent pas appeler de variables dans la portée. Comme suit

<?php
    function a(){
        $a = 11;        
        function b(){
            $b = 22;            
            echo $a;            
            echo $b;
        }
        b();
    }
    a();
    //报Notice:Undefined variable: a in index.php on line 6
    //22
    ?>
Copier après la connexion

D'après l'article ci-dessus, nous savons que c'est possible en js. Par conséquent, les fonctions anonymes en PHP sont également appelées fonctions de fermeture. Vous pouvez également transmettre des variables de la portée parent à la fonction de fermeture (obtenant un effet similaire à celui obtenu par js pour les variables de la portée parent). Le mot-clé use est utilisé en PHP, comme suit<🎜). >

<?php
$count = 0;

$a = function()
{ var_dump($count); };

$b = function() use ($count)
{ var_dump($count); };

$count++;

$c = function() use (&$count)
{ var_dump($count); };

$count++;

$a();    // null   Notice: Undefined variable: count in
$b();    // int 0
$c();    // int 2
$count++;
$b();    // int 0

?>
Copier après la connexion
Le résultat de l'exemple ci-dessus est-il différent de ce que vous pensez ?

Analyse : La fonction de fermeture (fonction anonyme) utilise use pour obtenir la variable de domaine d'effet secondaire lorsque la fonction est définie, peu importe le moment où elle est appelée. Si vous souhaitez obtenir la valeur de la variable lors de l'appel, vous devez la transmettre par référence. Comment l'utiliser dépend du scénario d'utilisation.

Liste plusieurs scénarios courants

  1. comme fonction de rappel

    //一个我们使用过的例子
    <?php/*
     * 菜谱拆分食物后的拼接
     * 参数均不能为空
     * */public function mergeFoodsStr($str,array $mapping){
     //        $str = &#39;白菜半棵、__2__鲍菇两只、__0__一根,__1__两根,三者比例为100:100:15,酱油5克,香油2克,盐1克。&#39;;//        $mapping = array(//            0 =>array(&#39;name&#39; => &#39;胡萝卜&#39;,&#39;id&#39; =>  &#39;81&#39; ),//            1 =>array ( &#39;name&#39; => &#39;萝卜&#39;, &#39;id&#39; =>  &#39;72&#39;),//            2 =>array ( &#39;name&#39; =>  &#39;杏&#39;, &#39;id&#39; => &#39;1841&#39;)//        );
        if(empty($str) || empty($mapping)){        return false;
        }    $strNew = preg_replace_callback(&#39;"|__(\d)__|" &#39;,function ($matches) use ($mapping){
            return $mapping[$matches[1]][&#39;name&#39;];
        },$str);    $this->log(&#39;拼接后的食材字符串&#39;,$strNew);    return $strNew;
    }?>
    Copier après la connexion
  2. Si c'est une fonction à usage unique qui ne peut pas être réutilisée, vous pouvez utiliser la fonction de fermeture

  3. Utilisez la fonction array_work() avec la fonction anonyme pour réduire le nombre de foreach calques

  4. Attendez

  5. 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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal