Maison  >  Article  >  développement back-end  >  Quelle est la fonction de la fermeture php

Quelle est la fonction de la fermeture php

王林
王林avant
2019-09-03 14:13:425524parcourir

Quelle est la fonction de la fermeture php

Les fermetures php sont différentes des fermetures en js Cet article expliquera les fermetures php pour votre référence.

Quand on parle de fermetures, nous devons mentionner les fonctions anonymes. Les fermetures PHP sont principalement implémentées par des fonctions anonymes.

Fonction anonyme

Déclaration :

1 $func = function() {
2  
3 }; //带结束符

Comme vous pouvez le constater, la fonction anonyme n'a pas de nom. Si vous souhaitez l'utiliser, vous en avez besoin. pour le renvoyer à une variable. Les fonctions anonymes peuvent également déclarer des paramètres comme les fonctions ordinaires, et la méthode d'appel est également la même :

1 $func = function( $param ) {
2     echo $param;
3 };$func( 'some string' );
4 //输出:
5 //some string

Au fait, avant que PHP n'introduise les fermetures, il existait également une fonction qui pouvait créer des fonctions anonymes : créer une fonction, mais la logique du code est uniquement. Il peut être écrit sous forme de chaîne, ce qui semble obscur et difficile à maintenir, donc peu de gens l'utilisent.

Implémenter la fermeture

Transmettez des fonctions anonymes en tant que paramètres dans les fonctions ordinaires, et elles peuvent également être renvoyées. Cela implémente une fermeture simple.

Exemple :

//例一
//在函数里定义一个匿名函数,并且调用它
function printStr() {
    $func = function( $str ) {
        echo $str;
    };
    $func( 'some string' );
}printStr();
  
//例二
//在函数中把匿名函数返回,并且调用它
function getPrintStrFunc() {
    $func = function( $str ) {
        echo $str;
    };
    return $func;
}
$printStrFunc = getPrintStrFunc();
$printStrFunc( 'some string' );
  
 
//例三
//把匿名函数当做参数传递,并且调用它
function callFunc( $func ) {
    $func( 'some string' );
}
$printStrFunc = function( $str ) {
    echo $str;
};
callFunc( $printStrFunc );
//也可以直接将匿名函数进行传递。如果你了解js,这种写法可能会很熟悉
callFunc( function( $str ) {
    echo $str;
} );

Mot clé pour connecter la fermeture et les variables externes : USE

function getMoney() {
    $rmb = 1;
    $dollar = 6;
    $func = function() use ( $rmb ) {
        echo $rmb;
        echo $dollar;
    };
    $func();
}getMoney();
//输出:
//1
//报错,找不到dorllar变量

La fermeture peut enregistrer certaines variables et valeurs​​dans le contexte du bloc de code. Par défaut en PHP, les fonctions anonymes ne peuvent pas appeler les variables de contexte du bloc de code dans lequel elles se trouvent, mais doivent utiliser le mot-clé use. Regardons un autre exemple :

Comme vous pouvez le voir, le dollar n'est pas déclaré dans le mot-clé use, il ne peut donc pas être obtenu dans cette fonction anonyme, vous devez donc faire attention à ce problème lors du développement.
Certaines personnes peuvent se demander s'il est possible de changer les variables de contexte dans une fonction anonyme, mais j'ai trouvé que ce n'est pas possible :

function getMoney() {
    $rmb = 1;
    $func = function() use ( $rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    $func();
    echo $rmb;
}getMoney();
//输出:
//1
//1

Ah, il s'avère que use fait référence à juste une copie du variable. Mais je veux une référence complète à la variable, pas une copie. Pour obtenir cet effet, ajoutez simplement un symbole & avant la variable :

function getMoney() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    $func();
    echo $rmb;
}getMoney();
//输出:
//1
//2

D'accord, pour que la fonction anonyme puisse référencer la variable de contexte. Si la fonction anonyme est renvoyée au monde extérieur, la fonction anonyme sauvegardera les variables référencées par l'utilisation, mais le monde extérieur ne pourra pas obtenir ces variables. De cette façon, le concept de « fermeture » peut être plus clair.

function getMoneyFunc() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    return $func;
}$getMoney = getMoneyFunc();
$getMoney();
$getMoney();
$getMoney();
//输出:
//1
//2
//3

Résumé
Les caractéristiques des fermetures PHP ne sont pas trop surprenantes. En fait, des fonctions similaires ou même plus puissantes peuvent être obtenues en utilisant CLASS, qui ne peut être comparée aux fermetures js. , nous ne pouvons qu'espérer des améliorations dans le support de fermeture de PHP à l'avenir. Cependant, les fonctions anonymes restent très utiles. Par exemple, lorsque vous utilisez des fonctions telles que preg_replace_callback, vous n'avez pas besoin de déclarer une fonction de rappel en externe.

Pour plus de questions connexes, veuillez visiter le site Web PHP chinois : Tutoriel vidéo 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer