Maison  >  Article  >  développement back-end  >  Le rôle des fonctions anonymes et des fermetures php

Le rôle des fonctions anonymes et des fermetures php

墨辰丷
墨辰丷original
2018-06-05 09:34:103135parcourir

Cet article présente principalement les fonctions anonymes et les fermetures PHP. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Le code est le suivant :

$func = function() {
   
}; //带结束符
可以看到,匿名函数因为没有名字,如果要使用它,需要将其返回给一个变量。匿名函数也像普通函数一样可以声明参数,调用方法也相同:
$func = function( $param ) {
  echo $param;
};
 
$func( 'some string' );
 
//输出:
//some string

1. Mettre en œuvre la fermeture

Convertir la fonction anonyme Elle est passée en paramètre dans une fonction normale et peut également être renvoyée. Cela implémente une fermeture simple.

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

2. Mots-clés pour connecter les fermetures et les variables externes : USE
Les fermetures peuvent enregistrer certaines variables et valeurs dans le contexte du bloc de code dans lequel elles 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.

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

Comme vous pouvez le voir, le dollar n'est pas déclaré dans le mot-clé use, et il ne peut pas être obtenu dans cette fonction anonyme, vous devez donc faire 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 :

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

Il s'avère que l'utilisation fait référence à des variables uniquement .Juste une copie. 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.

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

Résumé : Ce qui précède représente l'intégralité du contenu de cet article, j'espère cela peut être utile à tout le monde, apprendre aide.

Recommandations associées :

Explication détaillée de l'utilisation et exemples de sécurité des informations sur les cookies pour la connexion des utilisateurs PHP

La méthode d'implémentation de PHP renvoyant un horodatage à 13 chiffres

Explication détaillée de la méthode et exemples de PHP appelant son propre programme Java

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