Diagramme de fonction anonyme de fermeture PHP

墨辰丷
Libérer: 2023-03-31 21:48:01
original
1893 Les gens l'ont consulté

Cet article vous présente principalement la fonction anonyme PHP introduite dans php5.3, c'est-à-dire la fermeture (Closure), et le rôle de la fermeture. Elle est très détaillée et est recommandée ici aux amis dans le besoin.

La fermeture de PHP (Closure) est une fonction anonyme, introduite dans PHP5.3.

La syntaxe de la fermeture est très simple. Le seul mot-clé auquel vous devez prêter attention est use. Use est de connecter la fermeture et les variables externes.

Le code est le suivant :

$a = function() use($b) {}
Copier après la connexion

Un exemple simple est le suivant :

function callback($fun) {
$fun();
}
$msg = "Hello, everyone";
$fun = function () use($msg) {
print "This is a closure use string value, msg is: $msg. <br />/n";
};
$msg = "Hello, everybody";
callback($fun);
Copier après la connexion

Le résultat est : Ceci est une valeur de chaîne d'utilisation de fermeture, msg est : Bonjour à tous. < ;br />/n

Dans la syntaxe de fermeture récemment ouverte de PHP, nous utilisons use pour utiliser des variables définies en dehors de la fermeture. Ici, nous utilisons la variable externe $msg. Une fois définie, sa valeur est modifiée. Une fois la fermeture exécutée, la valeur d'origine est affichée. Pour les paramètres de type de base transmis par valeur, la valeur de l'utilisation de la fermeture est déterminée lors de la création de la fermeture.

La petite application est la suivante :

/** 
 * 一个利用闭包的计数器产生器 
 * 这里其实借鉴的是python中介绍闭包时的例子... 
 * 我们可以这样考虑: 
 *      1. counter函数每次调用, 创建一个局部变量$counter, 初始化为1. 
 *      2. 然后创建一个闭包, 闭包产生了对局部变量$counter的引用. 
 *      3. 函数counter返回创建的闭包, 并销毁局部变量, 但此时有闭包对$counter的引用,  
 *          它并不会被回收, 因此, 我们可以这样理解, 被函数counter返回的闭包, 携带了一个游离态的 
 *          变量. 
 *      4. 由于每次调用counter都会创建独立的$counter和闭包, 因此返回的闭包相互之间是独立的. 
 *      5. 执行被返回的闭包, 对其携带的游离态变量自增并返回, 得到的就是一个计数器. 
 * 结论: 此函数可以用来生成相互独立的计数器. 
 */  
function counter() {  
    $counter = 1;  
    return function() use(&$counter) {return $counter ++;};  
}  
$counter1 = counter();  
$counter2 = counter();  
echo "counter1: " . $counter1() . "<br />/n";  
echo "counter1: " . $counter1() . "<br />/n";  
echo "counter1: " . $counter1() . "<br />/n";  
echo "counter1: " . $counter1() . "<br />/n";  
echo "counter2: " . $counter2() . "<br />/n";  
echo "counter2: " . $counter2() . "<br />/n";  
echo "counter2: " . $counter2() . "<br />/n";  
echo "counter2: " . $counter2() . "<br />/n";  
?>
Copier après la connexion

Le rôle de la fermeture

1. Réduire le code de la boucle foreach

1. 🎜>Par exemple L'exemple de code Cart
<?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(&#39;butter&#39;, 1);
$my_cart->add(&#39;milk&#39;, 3);
$my_cart->add(&#39;eggs&#39;, 6);
// 打出出总价格,其中有 5% 的销售税.
print $my_cart->getTotal(0.05) . "\n";
// The result is 54.29
?>
Copier après la connexion

dans le manuel http://php.net/manual/en/functions.anonymous.php est le suivant :

Ici il faut utilisez la fonction getTotal si nous la transformons pour chaque.

2. Réduire les paramètres de la fonction

function html($code , $id="", $class=""){
if ($id !== "") $id = " id = \"$id\"" ;
$class = ($class !== "")? " class =\"$class\">":">";
$open = "<$code$id$class";
$close = "</$code>";
return function ($inner = "") use ($open, $close){
return "$open$inner$close";
    };
}
Copier après la connexion

Le code est le suivant :

Si on utilise la méthode habituelle, on va mettre inner en html Dans les paramètres de fonction, il est préférable d'utiliser des fermetures en termes de lecture et d'utilisation du code.

3. Déverrouillez la fonction récursive

<?php
$fib = function($n) use(&$fib) {
    if($n == 0 || $n == 1) return 1;
    return $fib($n - 1) + $fib($n - 2);
};
echo $fib(2) . "\n"; // 2
$lie = $fib;
$fib = function(){die(&#39;error&#39;);};//rewrite $fib variable 
echo $lie(5); // error   because $fib is referenced by closure
Copier après la connexion

Le code est le suivant :

Notez que l'utilisation dans la question ci-dessus utilise &, si vous n'utilisez pas & ici, ce sera le cas. Lorsque l'erreur fib(n-1) se produit, la fonction est introuvable (le type de fib n'a pas été défini précédemment)

Donc quand vous souhaitez utiliser une fermeture pour annuler la fonction boucle, vous devez utiliser
<?php
$recursive = function () use (&$recursive){
// The function is now available as $recursive
}
Copier après la connexion

Le code est le suivant :

Ce formulaire.

4. Retarder la liaison

Si vous devez retarder la liaison des variables utilisées, vous devez utiliser une référence, sinon une copie sera effectuée lors de la définition de la copie. en cours d'utilisation
<?php
$result = 0;
$one = function()
{
    var_dump($result);
};
$two = function() use ($result)
{
    var_dump($result);
};
$three = function() use (&$result)
{
    var_dump($result);
};
$result++;
$one();    // outputs NULL: $result is not in scope
$two();    // outputs int(0): $result was copied
$three();    // outputs int(1)
Copier après la connexion

Le code est le suivant :

Utiliser ou ne pas utiliser de références signifie attribuer des valeurs lors de l'appel ou attribuer des valeurs lors de la déclaration

Résumé

 : Ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.

Recommandations associées :

Méthode de tampon d'opération MySQL en php

Définition et utilisation de la fonction mail en php

Définition et utilisation de la fonction mail en php

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