Introduction aux fermetures PHP (Closure)

不言
Libérer: 2023-04-02 12:06:02
original
2092 Les gens l'ont consulté

Cet article présente principalement l'introduction de la fermeture PHP (Closure), qui a une certaine valeur de référence. Maintenant, je la partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

Fonction anonyme

. Lorsqu'il s'agit de fermetures, il faut penser aux fonctions anonymes, également appelées fonctions de fermeture (closures). Il semble que l'implémentation des fermetures PHP repose principalement sur elles. Déclarer une fonction anonyme se fait comme ceci :

$func = function() {
    
}; //带结束符
Copier après la connexion

Comme vous pouvez le constater, comme la fonction anonyme n'a pas de nom, si vous souhaitez l'utiliser, vous devez la renvoyer dans 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 :

$func = function( $param ) {
    echo $param;
};
$func( 'some string' );

//输出:
//some string
Copier après la connexion

D'ailleurs, avant que PHP n'introduise les fermetures, il existait également une fonction qui pouvait créer des fonctions anonymes : create function , mais le code Logic ne peut être écrit que sous forme de chaînes, ce qui semble obscur et difficile à maintenir, donc peu de gens l'utilisent.

Implémenter les fermetures

Passez 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.

Il y a trois exemples ci-dessous

//例一
//在函数里定义一个匿名函数,并且调用它
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;
} );
Copier après la connexion

Mots clés reliant les fermetures et les variables externes : USE

Les fermetures peuvent enregistrer certaines variables et valeurs​​dans le contexte du bloc de code dans lequel ils se trouvent. Par défaut en PHP, les fonctions anonymes ne peuvent pas appeler de variables de contexte dans le bloc de code où elles se trouvent, mais doivent utiliser le mot-clé use.

Regardons un autre exemple :

function getMoney() {
    $rmb = 1;
    $dollar = 6;
    $func = function() use ( $rmb ) {
        echo $rmb;
        echo $dollar;
    };
    $func();
}
getMoney();

//输出:
//1
//报错,找不到dorllar变量
Copier après la connexion

Comme vous pouvez le constater, le dollar n'est pas déclaré dans le mot-clé use, et il ne peut pas être obtenu dans cette fonction anonyme, il faut donc Faites attention à ce problème.

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
Copier après la connexion

Ah, il s'avère que use fait référence à juste Juste une copie de la 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
Copier après la connexion

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 enregistrera 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.

Modifiez l'exemple ci-dessus en fonction de la description :

function getMoneyFunc() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    return $func;
}

$getMoney = getMoneyFunc();
$getMoney();
$getMoney();
$getMoney();

//输出:
//1
//2
//3
Copier après la connexion

Résumé

Les caractéristiques des fermetures PHP ne sont pas trop surprenantes. En fait, vous pouvez utiliser CLASS pour y parvenir. des résultats similaires, voire puissants. Il a de nombreuses fonctions, et il ne peut être comparé à la fermeture de js. Nous ne pouvons qu'attendre avec impatience l'amélioration de la prise en charge de la fermeture par 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.

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. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Introduction à l'exécution asynchrone PHP de scripts

Bases de l'implémentation PHP d'AOP

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