Home  >  Article  >  Backend Development  >  The role of php anonymous functions and closures

The role of php anonymous functions and closures

墨辰丷
墨辰丷Original
2018-06-05 09:34:103148browse

This article mainly introduces the functions of PHP anonymous functions and closures. Interested friends can refer to it. I hope it will be helpful to everyone.

The code is as follows:

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

1. Implement closure

Place anonymous functions in ordinary It is passed in as a parameter in the function and can also be returned. This implements a simple closure.

//例一
//在函数里定义一个匿名函数,并且调用它
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. Keywords to connect closures and external variables: USE
Closures can save some variables and values ​​​​in the context of the code block in which they are located. By default in PHP, anonymous functions cannot call context variables in the code block where they are located, but need to use the use keyword.

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

As you can see, dollar is not declared in the use keyword, and it cannot be obtained in this anonymous function, so you should pay attention to this issue during development.

Some people may wonder whether it is possible to change the context variables in an anonymous function, but I found that it is not possible:

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

It turns out that use refers to only a copy of the variable. That’s all. But I want a full reference to the variable, not a copy.

To achieve this effect, just add an & symbol before the variable:

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

Okay, so that the anonymous function can reference the context variable. If the anonymous function is returned to the outside world, the anonymous function will save the variables referenced by use, but the outside world will not be able to obtain these variables. In this way, the concept of 'closure' may be clearer.

Change the above example according to the description:

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

Summary: The above is the entire content of this article, I hope it can help everyone learn Helps.

Related recommendations:

Detailed explanation of usage and examples of cookie information security for php user login

PHP implementation method of returning 13-digit timestamp

Detailed explanation of the method and examples of php calling its own java program

The above is the detailed content of The role of php anonymous functions and closures. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn