Résumé de plusieurs exemples d'utilisation de fonctions anonymes PHP

伊谢尔伦
Libérer: 2023-03-12 09:52:01
original
2044 Les gens l'ont consulté

Sans le savoir, j'ai découvert que PHP est sorti en version 5.5, et j'utilise PHP5.2, ce qui me fait ressembler à un jeune montagnard, rustique et arriéré. Après m'être habitué à utiliser les fermetures en javascript, je me suis soudainement intéressé aux fermetures PHP.

J'ai donc téléchargé en ligne un environnement de développement intégré WAMP, qui est la version PHP5.3 (PHP5.3 a commencé à introduire la fonctionnalité de fermeture, je dois dire que WAMP est vraiment pratique à installer et à installer). utiliser. . Après une configuration simple, commençons.

Fonction anonyme
Quand on parle de fermetures, il faut penser aux fonctions anonymes, aussi appelées fonctions de fermeture (closures), qui ressemblent comme les fermetures PHP, l'implémentation en dépend principalement. Déclarer une fonction anonyme c'est comme ceci :

Le code est le suivant :

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


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

Le code est le suivant :

$func = function( $param ) 
{    
echo $param;
};
$func( 'some string' );
//输出://some string
Copier après la connexion

Au fait, avant que PHP n'introduise fermetures, il existe également une fonction A qui peut créer des fonctions anonymes : créer une fonction, mais la logique du code ne peut être écrite que sous forme de chaîne , ce qui semble très obscur et difficile à maintenir, donc peu de gens l'utilisent.

Implémenter la fermeture
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

Le code est le suivant :

//例一
//在函数里定义一个匿名函数,并且调用它
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 pour connecter les fermetures et les externes variables : la fermeture USE
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 de variables de contexte dans le bloc de code où elles se trouvent, mais doivent utiliser le mot-clé use.

Regardons un autre exemple :

Le code est le suivant :

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é à l'usage mot-clé, dans cette fonction anonyme Il ne peut pas être obtenu à l'intérieur, nous devons donc prêter attention à ce problème pendant le 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 :

Le code est le suivant :

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 ce à quoi use fait référence n'est qu'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 :

Le code est le suivant :

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, ceci manière dont la fonction anonyme peut référencer les variables 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.

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

Le code est le suivant :

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é
Caractéristiques des fermetures PHP Il n'y a pas de grande surprise. En fait, des fonctions similaires, voire plus puissantes, peuvent être obtenues en utilisant CLASS, qui ne peut être comparée aux fermetures js. Nous ne pouvons qu'attendre avec impatience les futures améliorations de PHP concernant la prise en charge des fermetures . Cependant, les fonctions anonymes restent très utiles. Par exemple, lors de l'utilisation de fonctions telles que preg_replace_callback, il n'est pas nécessaire de déclarer la fonction de rappel en externe.

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