Maison  >  Article  >  développement back-end  >  Explication détaillée des exemples de fermeture et de déclaration de fonction anonyme en PHP

Explication détaillée des exemples de fermeture et de déclaration de fonction anonyme en PHP

伊谢尔伦
伊谢尔伦original
2017-07-01 11:56:161501parcourir

Cet article vous présente principalement la fonction PHP anonyme introduite dans php5.3, qui est la fermeture (Closure), et le rôle de la fermeture. Elle est très détaillée. Je la recommande aux amis dans le besoin. . eux.

Quand 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 ressemble à ceci :

$func = function() {
   
}; //带结束符
可以看到,匿名函数因为没有名字,如果要使用它,需要将其返回给一个变量。匿名函数也像普通函数一样可以声明参数,调用方法也相同:
$func = function( $param ) {
  echo $param;
};
 
$func( 'some string' );
 
//输出:
//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 ne peut être écrite que sous forme de string , cela semble très obscur et difficile à entretenir, donc peu de gens l'utilisent.

1. Implémenter des fermetures
Passez des fonctions anonymes en tant que paramètres dans des 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;
} );

2 Mots-clés reliant les fermetures et les variables externes : USE
Les fermetures peuvent enregistrer le contexte du bloc de code dans lequel ils sont localisés. Certaines variables et valeurs. 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变量

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 les fonctions anonymes, 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 l'utilisation est citée par 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 :

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é
Il n'y a pas beaucoup de surprise quant aux caractéristiques des fermetures PHP. En fait, des fonctions similaires voire beaucoup plus puissantes. peut être réalisé en utilisant CLASS La fonction ne peut pas être comparée à la fermeture de js. Nous ne pouvons qu'attendre avec impatience l'amélioration de la prise en charge de la fermeture de PHP à l'avenir. 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!

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