Maison  >  Article  >  développement back-end  >  Quelques exemples d'utilisation de fonctions anonymes php

Quelques exemples d'utilisation de fonctions anonymes php

怪我咯
怪我咯original
2017-06-28 11:55:581227parcourir

Fonctions anonymes (Fonctions anonymes), également appelées fermetures, permettent de créer temporairement une fonction sans nom spécifié. Le plus souvent utilisé comme valeur du paramètre (callback) de la fonction callback. Bien entendu, il existe également d’autres applications.

Exemple n°1 Exemple de fonction anonyme

<?php
echo  preg_replace_callback ( &#39;~-([a-z])~&#39; , function ( $match ) {
    return  strtoupper ( $match [ 1 ]);
},  &#39;hello-world&#39; );
// 输出 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, et un point-virgule doit être ajouté à la fin :

Exemple n°2 Exemple d'affectation de variable de fonction anonyme

<?php
$greet  = function( $name )
{
     printf ( "Hello %s\r\n" ,  $name );
};

$greet ( &#39;World&#39; );
$greet ( &#39;PHP&#39; );
?>

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.

Exemple n°3 Hériter des variables de la portée parent

<?php
$message  =  &#39;hello&#39; ;

// 没有 "use"
$example  = function () {
     var_dump ( $message );
};
echo  $example ();

// 继承 $message
$example  = function () use ( $message ) {
     var_dump ( $message );
};
echo  $example ();

// Inherited variable&#39;s value is from when the function
// is defined, not when called
$message  =  &#39;world&#39; ;
echo  $example ();

// Reset message
$message  =  &#39;hello&#39; ;

// 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  =  &#39;world&#39; ;
echo  $example ();

// Closures can also accept regular arguments
$example  = function ( $arg ) use ( $message ) {
     var_dump ( $arg  .  &#39; &#39;  .  $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 fonction ou Instruction d'en-tête 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). Les exemples sont les suivants :

Exemple n°4 Fermetures et étendues

<?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" ;
// 最后结果是 54.29
?>

Des fonctions anonymes sont actuellement implémentées via la classe Closure.


Version Description


5.4.0 $cela peut être utilisé pour des fonctions anonymes.

5.3.0 Des fonctions anonymes peuvent être utilisées.


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!

Déclaration:
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